Как разобрать HTML-страницу в Java, чтобы выделить определенные элементы? - PullRequest
0 голосов
/ 02 февраля 2012

По причинам, которые я не хочу обсуждать для целей этого вопроса, у меня есть класс Java, который публикует HTML-форму и читает ответ.

Небольшой фрагмент ответаЯ получаю:

<div class="main_box">

  <table width="100%" border="0" cellspacing="4" cellpadding="4" class='results'>
    <tr>
        <td colspan="3" class="title">Free Car ID Check Results</td>
    </tr>
    <tr>
        <td class='title' width='34%'>Vehicle Registration Number</td>
        <td width="43%">ABC123</td>
        <td width="23%" rowspan="4" valign="top"><p align="center"><img src="/media/FORD.jpg" alt="FORD" /></p>
        <p>      </p></td>
    </tr>
    <tr>
        <td  class='title'>Make</td>
        <td>FORD</td>
    </tr>
    <tr>
        <td class='title'>Model</td>
        <td>ESCORT</td>
    </tr>
    <tr>
        <td class='title'>Colour</td>
        <td>BLUE</td>
    </tr>
  </table>

</div>

Какой самый простой и надежный способ выделить make, model и colour из этого?Это лишь небольшая часть входного потока, который я читаю, и я не могу гарантировать, что HTML-элементы вне этого будут такими же, как на веб-странице, могут измениться.

Спасибо

Ответы [ 4 ]

2 голосов
/ 02 февраля 2012

Используйте анализатор HTML, например JSoup .Позволяет легко читать документ и выбирать элементы.

Например:

Document doc = Jsoup.connect("http://url").get();
Elements elements = doc.select("div[class=main_box] td[class=title]");
for (Element anElement : elements) {
    // Real treatment here
    System.out.print(anElement.text());
    System.out.println(": "+anElement.nextElementSibling().text());
}
0 голосов
/ 11 февраля 2012

попробуйте это «http://developer.yahoo.com/dotnet/howto-xml_vb.html" оно написано на языке Microsoft, но может быть полезно, если вы хотите перевести с одного языка на другой. Удачи!

0 голосов
/ 03 февраля 2012

В комментарии я пообещал @his, что попробую JSoup и сравню его с моим более хакерским кодом стиля «просто поиск> Make <» (который находится в небольшом классе, который я написал под названием HTMLGrabber.) </p>

Во-первых, я обнаружил, что JSoup прост в использовании, он обрабатывает по крайней мере один из паршивых HTML-файлов, которые я тестировал (есть еще три, которые нужно протестировать).Полученный код был по длине похож на код HTMLGrabber.Чуть дольше, но не плохо.И HTMLGrabber не так прост, как я помню, так как я добавил некоторый код unescape / escape, незначительную поддержку атрибутов и т. Д. *

Любой подход "соскоба" в конечном итоге неНадежность, если веб-сайт кардинально меняется.

«Преимущества» кода стиля HTMLGrabber в том, что вы ищете на основе непосредственно содержимого.В примере с автомобильным кодом вы, вероятно, сначала перейдете к «Результаты проверки бесплатного идентификатора автомобиля», затем найдите «> Make <», затем <code>"<td>" и получите текст перед следующим "</td>", получив «FORD».Тогда аналогично для "> Model <" и "> Color <".Почему это возможно "преимущество"?Если <em>структура HTML-кода изменится, например, он больше не находится в таблице или добавлено больше строк, этот подход все еще может работать.то есть он «более устойчив» (но все еще далек от совершенства) перед лицом структурных изменений в HTML.

Преимущество подхода JSoup / «настоящий анализатор» состоит в том, что он обрабатывает глупые escape-символы,Кроме того, обычно (по крайней мере, как я бы это написал, YMMV) вы будете следовать структуре HTML, по крайней мере частично, чтобы найти то, что вам нужно.В примере с автомобилем вы бы искали элемент div с классом main_box, затем нашли таблицу, затем строки и т. Д. Этот подход более надежен в условиях изменений content .Например, когда ваш веб-сайт будет выкуплен, а «Результаты проверки бесплатных идентификаторов автомобилей» изменится на «Результаты проверки идентификаторов автомобилей Facebook», это все равно будет работать.(Обратите внимание, что нет ничего идеального, если «main_box» изменится на «primary_box», у вас будут проблемы).

Я понятия не имею, чаще ли контент или структурные изменения происходят на случайных сайтах, которые люди чистят.У кого-нибудь есть статистика или опыт?

Таким образом, я нашел JSoup "достаточно простым", чтобы использовать его большую часть времени в будущем, так как я подозреваю, что в целом он более надежный.Но для многих веб-сайтов подход «просто хватай» может быть лучше.

ADDENDUM Для двух моих веб-страниц HTML-код был настолько перемешан, что, хотя Jsoup удалось проанализировать его, используя Jsoup дляпройти через DOM оказалось так сложно, что я застрял с быстрым и грязным.

0 голосов
/ 02 февраля 2012

«Простой» способ, который я использовал для получения данных с веб-сайтов, заключается в тщательном анализе их HTML, а затем просто в поиске чего-то отличительного, например, ">Make<", затем в поиске следующего "<td>", затем следующего"</td>", и возьмите то, что находится между ними.

Это явно очень ненадежно, если у них есть экранирующие символы, если имеется более одного экземпляра "> Make <" и т. Д. Или когда они меняютсяих вывод в будущем. </p>

Однако «надежные» методы с причудливыми синтаксическими анализаторами XHTML и т. д. обычно предполагают, что веб-сайт возвращает хорошо сформированный HTML или XHTML .По моему опыту, никто не возвращает хорошо сформированный HTML .:-( Ну, не много ... Возможно, мой быстрый и грязный способ более надежен, чем использование реального парсера.

ps - для тех экспертов SO, которые предложат реальные ответы с реальными парсерами, пожалуйста, опишитекак они обрабатывают плохо сформированный HTML, так как у меня были реальные проблемы с этим ...

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