Perl Parse HTML дерево Buidler или элемент или парсер - PullRequest
2 голосов
/ 14 июня 2011

Я пытаюсь извлечь некоторую информацию html, используя perl. Я узнал о TreeBuilder, Element и Parser, какой мне следует использовать? Как мне извлечь имя и значение строки ниже? Кроме того, это встроено в html-структуру, единственный способ действительно указать, какое поле мне нужно, это получить значение столбца «Количество каталогов». Или я должен просто сделать регулярное выражение для всего HTML?

<table cellspacing="0">
    <tbody><tr><td class="black">Number of directories</td><td class="black">:</td><td class="black">&nbsp;80</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;monitored&nbsp;source&nbsp;files</td><td class="black">:</td><td class="black">&nbsp;425</td></tr>
        <tr><td class="black">Number of functions</td><td class="black">:</td><td class="black">&nbsp;6245</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;source&nbsp;lines</td><td class="black">:</td><td class="black">&nbsp;3245</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;measurement&nbsp;points</td><td class="black">:</td><td class="black">&nbsp;2457</td></tr>
        <tr><td class="red">TER</td><td class="red">:</td><td class="red">&nbsp;<strong>12%</strong>&nbsp;(decision)</td></tr>
    </tbody></table>

Ответы [ 3 ]

1 голос
/ 14 июня 2011

Если вам нужно извлечь данные из таблицы HTML, то

use HTML::TableExtract;

будет хорошим выбором.

0 голосов
/ 14 июня 2011

Есть несколько шагов.

  1. Используйте один из конструкторов HTML :: TreeBuilder для анализа HTML.
  2. Преобразование объекта HTML :: TreeBuilder в корне в HTML:: Элемент путем вызова elementify.
  3. Понимаете структуру своего HTML достаточно хорошо, чтобы вы могли HTML :: Element :: look_down () найти интересующие вас битыв. Вы можете указать критерии практически в любой мыслимой форме.
  4. Используйте HTML :: Element :: look_down (), content_list (), left (), right () и связанные методы для обхода интересующей области иизвлечь данные. НЕ ИСПОЛЬЗУЙТЕ traverse() - это была плохая идея.
  5. Передайте собранные вами данные любой системе, которая их запрашивала.

Вот некоторый код:

my $blarg = <<'END_HTML';
<table cellspacing="0">
    <tbody><tr><td class="black">Number of directories</td><td class="black">:</td><td class="black">&nbsp;80</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;monitored&nbsp;source&nbsp;files</td><td class="black">:</td><td class="black">&nbsp;425</td></tr>
        <tr><td class="black">Number of functions</td><td class="black">:</td><td class="black">&nbsp;6245</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;source&nbsp;lines</td><td class="black">:</td><td class="black">&nbsp;3245</td></tr>
        <tr><td class="black">Number&nbsp;of&nbsp;measurement&nbsp;points</td><td class="black">:</td><td class="black">&nbsp;2457</td></tr>
        <tr><td class="red">TER</td><td class="red">:</td><td class="red">&nbsp;<strong>12%</strong>&nbsp;(decision)</td></tr>
    </tbody></table>
END_HTML

# Use any of the constructors to get your base object.  See the pod.
my $tree = HTML::TreeBuilder->new_from_content($blarg);

$tree->elementify;  # Make it just a plain HTML::Element object.

# Iterate over a list of rows:  look_down and related functions provide powerful ways to find matching elements.  Read the pod for more details.
my %crud_from_table;
for my $row ( $tree->look_down( _tag => 'tr' ) ) {
    my ($key, $value) = map $_->as_text, $row->content_list;  # assumes two td per row.
    $crud_from_table{$key} = $value;
}

Самая важная часть заключается в понимании и умении look_down() найти нужную информацию.Иногда вы можете увеличить масштаб, сопоставив идентификатор.В других случаях вам нужно искать третий div класса 'foo' с таблицей в нем.Это также самая сложная и та часть, в которой я могу помочь вам как минимум.Тебе просто придется поэкспериментировать.

Удачи.

0 голосов
/ 14 июня 2011

Конечно, у каждого будет свой фаворит. Я предпочитаю HTML::TokeParser, я нахожу это легким для понимания и использования (как только вы преодолеете горстку того, как работают возвратные массивы). Конечно, я должен указать вам на классическую статью, напоминающую вам , пожалуйста, не анализируйте HTML с регулярными выражениями .

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