Получить <td>значений с Perl - PullRequest
       2

Получить <td>значений с Perl

4 голосов
/ 30 сентября 2011

Итак, у меня есть инструмент отчетности, который выплевывает статистику планирования заданий в файле HTML, и я собираюсь использовать эти данные с помощью Perl.Я не знаю, как пройти через таблицу HTML.

Я знаю, как сделать это с помощью jQuery, используя

$.find('<tr>').each(function(){
  variable = $(this).find('<td>').text
});

Но я не знаю, как сделать эту же логикус перл.Что я должен делать?Ниже приведен пример вывода HTML.Каждая строка таблицы содержит три одинаковые характеристики: имя объекта, статус и код возврата.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="UC4 Reporting Tool V8.00A">
<Title></Title>
<style type="text/css">
th,td {
font-family: arial;
font-size: 0.8em;
}

th {
background: rgb(77,148,255);
color: white;
}

td {
border: 1px solid rgb(208,213,217);
}  

table {
border: 1px solid grey; 
background: white;
}

body {
background: rgb(208,213,217);
}
</style>
</HEAD>
<BODY>
<table>
<tr>
  <th>Object name</th>
  <th>Status</th>
  <th>Return code</th>
</tr>
<tr>
  <td>JOBS.UNIX.S_SITEVIEW.WF_M_SITEVIEW_CHK_FACILITIES_REGISTRY</td>
  <td>ENDED_OK - ended normally</td>
  <td>0</td>
</tr>
<tr>
  <td>JOBS.UNIX.ADMIN.INFA_CHK_REP_SERVICE</td>
  <td>ENDED_OK - ended normally</td>
  <td>0</td>
</tr>
<tr>
  <td>JOBS.UNIX.S_SITEVIEW.WF_M_SITEVIEW_CHK_FACILITIES_REGISTRY</td>
  <td>ENDED_OK - ended normally</td>
  <td>0</td>
</tr>

Ответы [ 5 ]

11 голосов
/ 30 сентября 2011

Модуль HTML :: Query - это оболочка для анализатора HTML, предоставляющая интерфейс запросов, знакомый пользователям jQuery. Так что вы могли бы написать что-то вроде

use HTML::Query qw(Query);
my $docName = "test.html";
my $doc = Query(file => $docName);

for my $tr ($doc->query("td")) {
  for my $td (Query($tr)->query("td")) {
    # $td is now an HTML::Element object for the td element
    print $td->as_text, "\n";
  }
}

Прочтите документацию по HTML :: Query, чтобы получить лучшее представление о том, как ее использовать - приведенный выше пример не самый красивый.

9 голосов
/ 30 сентября 2011

Вы можете использовать RegExp, но в Perl уже есть модули, созданные для этой конкретной задачи. Проверить HTML :: TableContentParser

Возможно, вы бы сделали что-то вроде этого:

use HTML::TableContentParser;

$tcp = HTML::TableContentParser->new;
$tables = $tcp->parse($HTML);

foreach $table (@$tables) {
  foreach $row (@{ $tables->{rows} }) {
    foreach $col (@{ $row->{cols} }) {
      # each <td>
      $data = $col->{data};
    }
  }
}
3 голосов
/ 30 сентября 2011

Здесь я использую HTML :: Parser, немного многословно, но гарантированно работает.Я использую оператор Diamond, поэтому вы можете использовать его в качестве фильтра.Если вы вызываете этот Perl source extractTd, вот несколько способов вызвать его.

$ extractTd test.html

или

$ extractTd < test.html

оба будут работать, вывод будет идти на стандартный вывод, и вы можетеперенаправить его в файл.

#!/usr/bin/perl -w

use strict;

package ExtractTd;
use 5.010;
use base "HTML::Parser";

my $td_flag = 0;

sub start {
    my ($self, $tag, $attr, $attrseq, $origtext) = @_; 
    if ($tag =~ /^td$/i) {
        $td_flag = 1;
    }   
}

sub end {
    my ($self, $tag, $origtext) = @_; 
    if ($tag =~ /^td$/i) {
        $td_flag = 0;
    }   
}

sub text {
    my ($self, $text) = @_; 
    if ($td_flag) {
        say $text;
    }   
}

my $extractTd = new ExtractTd;
while (<>) {
    $extractTd->parse($_);
}
$extractTd->eof;
2 голосов
/ 30 сентября 2011

Perl CPAN модуль HTML :: TreeBuilder.

Я широко использую его для анализа большого количества документов HTML.

Концепция заключается в том, что вы получаете HTML :: Element (корневой узел на примере). Из него вы можете искать другие узлы:

  • Получить список дочерних узлов с помощью -> content_list ()
  • Получить родительский узел с помощью -> parent ()

Отказ от ответственности: следующий код не был протестирован, но это идея.

my $root = HTML::TreeBuilder->new;
$root->utf8_mode(1);
$root->parse($content);
$root->eof();
# This gets you an HTML::Element, of the root document
$root->elementify();

my @td = $root->look_down("_tag", "td");
foreach my $td_elem (@td)
{
    printf "-> %s\n", $td_elem->as_trimmed_text();
}

Если ваша таблица более сложна, вы можете сначала найти элемент TABLE, затем выполнить итерацию для каждого дочернего элемента TR и для каждого дочернего элемента TR выполнить итерацию по элементам TD

http://metacpan.org/pod/HTML::TreeBuilder

2 голосов
/ 30 сентября 2011

Вы пробовали смотреть на cpan для библиотек HTML?Это похоже на то, что вы хотите http://search.cpan.org/~msisk/HTML-TableExtract-2.11/lib/HTML/TableExtract.pm

Также здесь есть целая страница различных HTML-библиотек для использования http://search.cpan.org/search?m=all&q=html+&s=1&n=100

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