0

我正在编写一个 HTML 刮板程序,当它从页面中抓取 HTML 时,它会返回 HTML,我想抓取所有大写字母的单词,然后将这些单词存储到数据库中。我现在的问题是我无法正确的算法来解析我返回的 HTML 的每一行以存储单词。这基本上就是我正在使用的格式。重要你会注意到大写字母的单词总是第一个,所以基本上我只需要查看每行 HTML 的第一个字母,然后确定整个单词是否大写。如果是,那么我想将这个词添加到列表中,如果不是,那么我想转到下一行......所以它看起来像这样......

姓名列表 ----> 应跳过此行,因为第一个单词并非全部大写
AARON ....
ABRAHAM ....
ANGELA ...
AMY ...
ASHLEY ....

       AARON through ASHLEY should be added to list because first word is all CAPS 

我能够获得上述格式的 html,但现在我很难编写算法来获取每行的第一个单词,然后

有没有人知道如何在不使用外部解析而只使用循环和列表的情况下做到这一点。谢谢,感谢您的帮助

4

3 回答 3

3

首先,我不会重新发明轮子,而且因为解析糟糕的 HTML 会很痛苦,我会使用现有的 HTML 解析器,比如TagSoupJericho实际上,我更喜欢 Jericho,因为它具有从 HTML 标记中提取所有文本的内置功能。

然后,我将使用正则表达式 ( \p{Upper}+) 提取所有大写单词。见java.util.regex

于 2009-10-10T21:09:29.767 回答
2

您可以使用正则表达式执行此操作:

for (String line: lines) {
    if (line.matches("[A-Z]+\\b.*")) {
        ...
    }
}

这匹配任何有一个或多个大写字母的行[A-Z]+,后跟一个单词边界\\b,然后是其他任何内容.*\\b.*如果您只希望每行只有一个名称,之后什么都没有,您可以摆脱。

或者,您可以使用 aString.split()将行分解为单词,然后检查第一个单词是否全部大写:

for (String line: lines) {
    String[] words = line.split("\\s");

    if (words.length > 0 && words[0].equals(words[0].toUpperCase())) {
        ...
    }
}

这里\\s匹配任何空格、制表符或其他空白字符。

于 2009-10-10T20:47:32.040 回答
2
String line = "AARON asdfasdflökj";

int i;
String cmp;

if( (i=line.indexOf(' ')) != -1 ) {
    cmp = line.substring( 0, i );
} else {
    cmp = line;
}

if( cmp.equals( cmp.toUpperCase() ) ) {
    // Line starts with all capitals
} else {
    // ...
}

第一个 if 检查 String 行中是否有空格并删除它后面的所有内容。第二个 if 检查字符串中的每个字符是否都是大写的。

于 2009-10-10T20:52:16.353 回答