我需要从网页上打印具有班级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;
但我没有得到我想要的内容。我的代码出了什么问题?
答案 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 $_})'
欢呼声,