2010-03-06 2 views
4

У меня возник вопрос о поиске тегов html с использованием Java и Regex.Вопрос о разборе HTML с использованием Regex и Java

Я использую следующий код, чтобы найти все теги в HTML, documentURL, очевидно, является содержимым HTML.

Метод find возвращает true, что означает, что он может найти что-то в HTML, но метод matches() всегда возвращает false, и я полностью и полностью озадачен этим.

Я также ссылался на документацию по Java, но не смог найти ответ.

Каков правильный способ использования Matcher?

Pattern keyLineContents = Pattern.compile("(<.*?>)"); 

    Matcher keyLineMatcher = keyLineContents.matcher(documentURL); 

    boolean result = keyLineMatcher.find(); 

    boolean matchFound = keyLineMatcher.matches(); 

Делать что-то вроде этого бросает Exeption:

 String abc = keyLineMatcher.group(0); 

Спасибо.

+4

Не ответ, который вы хотели, но избежать разбора HTML с регулярным выражением. Правильный способ - использовать парсер HTML. http://java-source.net/open-source/html-parsers – Yacoby

ответ

7

Правильный способ перебрать матчей:

Pattern p = Pattern.compile("<.*?>"); 
Matcher m = p.matcher(htmlString); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

Это, как говорится, регулярные выражения являются чрезвычайно беден метод разбора HTML. Причина сводится к следующему: регулярные выражения хорошо работают для разбора regular languages. HTML - это context free language. Там, где регулярные выражения падают, для таких вещей, как вложенные теги, используются значения > внутри значений атрибутов и т. Д.

Используйте выделенный анализатор HTML вместо HTML Parser.

+0

Спасибо, что работает. :) Я буду использовать парсер html позже. – Elham

+5

«Я буду использовать парсер html позже». Это все, что они говорят ... :-) –

2

Почему бы вам не попробовать исходный код некоторых HTML-парсеров с открытым исходным кодом? HtmlCleaner, Tagsup и т. Д.

Общая стратегия заключается в попытке проанализировать и очистить html и вернуть дерево Xml.

Лично я читал HTML-сообщение, добавляя открывающие теги к очереди LIFO и удаляя (сопоставляя) открывающие теги с начала очереди при обнаружении закрывающего тега - выполнение переключения очереди, чтобы допускать несоответствие тегов.

+0

Является ли этот ответ ответом на вопрос @ Raha о написании собственного парсера HTML? –

1

Я хочу, чтобы получить содержание ключевых слов из HTML тега я написал:

Pattern keyLineContents = Pattern.compile("<(.[^<]*)(keywords)(.[^<]*)>"); 
Matcher keyLineMatcher = keyLineContents.matcher(documentURL); 
boolean result = keyLineMatcher.find(); 
while(result) 
{ 
    String metaTagContent = keyLineMatcher.group(1) + " " + keyLineMatcher.group(3); 
    Pattern kcontent = Pattern.compile("(.*?content=\")(.[^<]*?)(\".[^<]*?)"); 
    Matcher keyLineMatcher2 = kcontent.matcher(metaTagContent); 
    boolean result2 = keyLineMatcher.find(); 
    while (result2) 
    { 
    String metaTagContent2 = keyLineMatcher.group(1); 
    result2 = keyLineMatcher.find(); 
    } 
} 

Но я не понимаю, почему мой result2 ложно. Результат один прекрасно дают все содержание ключевого слова тега

благодаря

+0

Вместо этого используйте следующие выражения: '' <([^ <] *) (ключевые слова) ([^ <]*)> "и' ". *? Content = \" ([^ <] *?) \ "" ' –