TreeBuilder Получить встроенные узлы

По сути, мне нужно получить имена и электронные письма от всех этих людей в HTML-коде.

<thead>
        <tr>
            <th scope="col" class="rgHeader" style="text-align:center;">Name</th><th scope="col" class="rgHeader" style="text-align:center;">Email Address</th><th scope="col" class="rgHeader" style="text-align:center;">School Phone</th>
        </tr>
    </thead><tbody>
    <tr class="rgRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__0">
        <td>
                            Michael Bowen
                        </td><td>mbowen@cpcisd.net</td><td>903-488-3671 ext3200</td>
    </tr><tr class="rgAltRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__1">
        <td>
                            Christian Calixto
                        </td><td>calixtoc@cpcisd.net</td><td>903-488-3671 x 3430</td>
    </tr><tr class="rgRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__2">
        <td>
                            Rachel Claxton
                        </td><td>claxtonr@cpcisd.net</td><td>903-488-3671 x 3450</td>
    </tr>
    </tbody>

</table><input id="ctl00_ContentPlaceHolder1_rg_People_ClientState" name="ctl00_ContentPlaceHolder1_rg_People_ClientState" type="hidden" autocomplete="off">    </div>


        <br>

Я знаю, как использовать treebuilder с узлами и тому подобным, и я использую этот код в некоторых моих скриптах.

    my ($file) = @_;
my $html = path($file)-> slurp;
my $tree = HTML::TreeBuilder->new_from_content($html);
my @nodes = $tree->look_down(_tag => 'input');
my $val;
foreach my $node (@nodes) {
    $val = $node->look_down('name', qr/\$txt_Website/)->attr('value');
}
return $val;

Я собирался использовать тот же код для этой функции, но я понял, что мне не нужно много искать, так как <td> тег находится во многих других местах сценария. Я уверен, что есть лучший способ решить эту проблему, но я не могу найти его.

ССЫЛКА НА HTML-КОД: http://pastebin.com/qLwu80ZW

МОЙ КОД: https://pastebin.com/wGb0eXmM

Примечание: я посмотрел на Google как можно больше, но я не совсем уверен, что я должен искать.

1 ответ

Решение

table элемент, который содержит необходимые данные, имеет уникальный класс rgMasterTable так что вы можете найти это в look_down

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

use strict;
use warnings 'all';

use LWP::Simple 'get';
use HTML::TreeBuilder;

use constant URL => 'http://pastebin.com/raw/qLwu80ZW';

my $tree = HTML::TreeBuilder->new_from_content(get URL);

my ($table) = $tree->look_down(_tag => 'table', class => 'rgMasterTable');

for my $tr ( $table->look_down(_tag => 'tr') ) {

    next unless my @td = $tr->look_down(_tag => 'td');

    my ($name, $email) = map { $_->as_trimmed_text } @td[0,1];

    printf  "%-17s %s\n", $name, $email;
}

выход

Michael Bowen     mbowen@cpcisd.net
Christian Calixto calixtoc@cpcisd.net
Rachel Claxton    claxtonr@cpcisd.net
Другие вопросы по тегам