Разбор HTML для Perl - PullRequest
       5

Разбор HTML для Perl

5 голосов
/ 20 марта 2011

Существуют ли какие-нибудь мощные инструменты / библиотеки для Perl, например BeautifulSoup to python?

Спасибо

Ответы [ 3 ]

9 голосов
/ 20 марта 2011

HTML :: TreeBuilder :: XPath - достойное решение для большинства проблем.

6 голосов
/ 20 марта 2011

Я никогда не использовал BeautifulSoup, но из быстрого просмотра его документации вы можете захотеть HTML :: TreeBuilder . Он может хорошо обрабатывать даже испорченные документы и позволяет просматривать проанализированное дерево или элементы запроса - посмотрите метод look_down в HTML :: Element .

Если вам нравится / знаете XPath, см. Рекомендацию daxim. Если вы хотите выбирать элементы с помощью селектора CSS, взгляните на Web :: Scraper или Mojo :: DOM .

1 голос
/ 20 марта 2011

Поскольку вы ищете мощь, вы можете использовать XML :: LibXML для разбора HTML. Преимущество заключается в том, что у вас есть все возможности самого быстрого и лучшего набора инструментов XML (за исключением MSXML, который предназначен только для MS), доступного для Perl для обработки вашего документа, включая XPath и XSLT (который потребует повторного анализа, если вы используете другой парсер чем XML :: LibXML).

use strict;
use warnings;
use XML::LibXML;
# In 1.70, the recover and suppress_warnings options won't shup up the
# warnings. Hence, a workaround is needed to keep the messages away from
# the screen.
sub shutup_stderr {
    my( $subref, $bufref ) = @_;
    open my $fhbuf, '>', $bufref;
    local *STDERR = $fhbuf;
    $subref->(); # execute code that needs to be shut up
    return;
}
# ==== main ============================================================
my $url = shift || 'http://www.google.de';
my $parser = XML::LibXML->new( recover => 2 ); # suppress_warnings => 1
# Note that "recover" and "suppress_warnings" might not work - see above.
# https://rt.cpan.org/Public/Bug/Display.html?id=58024
my $dom; # receive document
shutup_stderr
    sub { $dom = $parser->load_html( location => $url ) }, # code
    \my $errmsg; # buffer
# Now process document as XML.
my @nodes = $dom->getElementsByLocalName( 'title' );
printf "Document title: %s\n", $_->textContent for @nodes;
printf "Lenght of error messages: %u\n", length $errmsg;
print '-' x 72, "\n";
print $dom->toString( 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...