Справка по алгоритму синтаксического разбора HTML - PullRequest
0 голосов
/ 11 октября 2009

Я пишу программу, которая представляет собой скребок HTML, который при получении HTML-кода со страницы возвращает HTML-код, и я хочу получить слова, которые являются заглавными буквами, и затем сохранить эти слова в базе данных. Моя проблема сейчас заключается в том, что я не могу исправить алгоритм для анализа каждой строки HTML-кода, который я получил, чтобы сохранить слова. По сути, это тот формат, с которым я работаю. ВАЖНО Вы заметите, что слова, написанные заглавными буквами, всегда являются первыми, поэтому по сути мне нужно только взглянуть на первую букву каждой строки HTML, а затем решить, является ли все слово заглавной. Если это так, я хочу добавить слово в список, если это не так, я хочу перейти к следующей строке ... Так что это будет выглядеть так ...

список имен ----> Эта строка должна быть пропущена, потому что первое слово не все CAPS
Аарон ....
АВРААМ ....
Анжела ...
Эми ...
ЭШЛИ ....

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

Я могу получить HTML в формате выше, но сейчас мне трудно написать алгоритм для получения первого слова каждой строки, а затем

Кто-нибудь знает, как это сделать, не используя внешний синтаксический анализ и просто используя циклы и списки. Спасибо, я ценю вашу помощь

Ответы [ 3 ]

3 голосов
/ 11 октября 2009

Во-первых, вместо того, чтобы заново изобретать колесо, и, поскольку анализ плохого HTML может быть затруднен, я бы использовал существующий анализатор HTML, например, TagSoup или Jericho . На самом деле, у Jericho есть мои предпочтения, поскольку он имеет встроенную функциональность для извлечения всего текста из HTML-разметки .

Тогда я бы использовал регулярное выражение (\p{Upper}+), чтобы извлечь все слова в верхнем регистре. См java.util.regex.

2 голосов
/ 11 октября 2009
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 проверяет, является ли каждый символ прописным в строке.

2 голосов
/ 11 октября 2009

Вы можете сделать это с помощью регулярного выражения :

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

Это соответствует любой строке, которая имеет одну или несколько заглавных букв [A-Z]+, за которыми следует граница слова \\b, за которой следует что-либо еще .*. Вы можете избавиться от \\b.*, если ожидаете, что в каждой строке будет только одно имя, а после - ничего.

В качестве альтернативы вы можете использовать String.split(), чтобы разбить строку на слова, а затем проверить первое слово для всех заглавных букв:

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

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

Здесь \\s соответствует любому пробелу, табуляции или другому символу пробела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...