Perl - 按类打印div

时间:2014-11-16 07:06:20

标签: html css perl dom

我需要从网页上打印具有班级div的特定productSpecs。这是我的代码。

use strict;
use LWP::Simple;
use HTML::TreeBuilder::XPath qw();

my $url="http://www.flipkart.com/samsung-b310e-guru-music-2/p/itmdz9am8xehucbx";
my $content = get($url);
my $t = HTML::TreeBuilder::XPath->new;
$t->parse($content);
my $rank = $t->findvalue('//*[@class="productSpecs"]');
print $rank;

但我没有得到我想要的内容。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:3)

检查您要解析的HTML代码,所需的div节点具有此声明:

<div class="productSpecs specSection">

所以你的代码应该是:

my $rank = $t->findnodes('//div[@class="productSpecs specSection"]');

答案 1 :(得分:1)

您好user2186465欢迎来到Stack Exchange :-)

当您从HTML::TreeBuilder::XPath的{​​{1}}方法分配和打印输出时,它似乎默认解析/呈现findnodes->()节点并将内容作为文本返回。除此之外,它返回一个<div>对象(XML::XPathEngine::NodeSet使用)和一个引用HTML::TreeBuilder::XPath对象的数组,该对象具有您想要的内容。您需要将该数组元素引用分配给HTML::Tree变量,否则您只需获取文本:

$rank

NB:这会出现在文档中的某个位置作为示例,但并不突出)。获得my $rank = $t->findnodes('//div[@class="productSpecs specSection"]')->[0]; 对象后,可以使用print语句中的一个方法来获取内容。

如果没有HTML::Element,您会收到呈现的文字,->[0]只会显示;但是使用print $rank,您可以访问对象及其方法,以便->[0]可以显示节点中的原始HTML内容(print $rank->as_HTML也可以)。 ->as_XML还有一个HTML::TreeBuilder::XPath便捷方法,可以让输出更容易阅读。所以:

as_XML_indented

应该做你想做的事。

HTH

答案 2 :(得分:1)

为了进行比较,我使用ojo工具(非常适合oneliners)使用Mojolicious进行了尝试,默认情况下Mojo::DOM似乎会返回HTML,除非您要求->text()的文字方法。 例如这似乎可以做你想要的:

perl -Mojo -E 'g("http://www.flipkart.com/samsung-b310e-guru-music-2/p/itmdz9am8xehucbx")
 ->dom->find("div.productSpecs")->each(sub{say $_})'

欢呼声,