【发布时间】:2015-08-23 05:03:15
【问题描述】:
我在我的 perl 脚本中使用 WWW::Mechanize、HTML::TreeBuilder 和 HTML::Element 来浏览 html 文档。
我想知道如何搜索包含某个字符串作为文本的元素。
这是一个 html 文档的示例:
<html>
<body>
<ul>
<li>
<div class="red">Apple</div>
<div class="abc">figure = triangle</div>
</li>
<li>
<div class="red">Banana</div>
<div class="abc">figure = square</div>
</li>
<li>
<div class="green">Lemon</div>
<div class="abc">figure = circle</div>
</li>
<li>
<div class="blue">Banana</div>
<div class="abc">figure = line</div>
</li>
</ul>
</body>
</html>
我想提取文本square。要获得它,我必须搜索具有以下属性的元素:
- 标签名称是“div”
- 类是“红色”
- 内容是文本“香蕉”
然后我需要获取它的父级(<li>-元素),并从父级获取文本以figure = 开头的子级,但这很容易。
我是这样尝试的:
use strict;
use warnings;
use utf8;
use Encode;
use WWW::Mechanize;
use HTML::TreeBuilder;
use HTML::Element;
binmode STDOUT, ":utf8";
my $mech = WWW::Mechanize->new();
my $uri = 'http.....'; #URI of an existing html-document
$mech->get($uri);
if (($mech->success()) && ($mech->is_html())) {
my $resp = $mech->response();
my $cont = $resp->decoded_content;
my $root = HTML::TreeBuilder->new_from_content($cont);
#this works, but returns 2 elements:
my @twoElements = $root->look_down('_tag' => 'div', 'class' => 'red');
#this returns an empty list:
my @empty = $root->look_down('_tag' => 'div', 'class' => 'red', '_content' => 'Banana');
# do something with @twoElements or @empty
}
我必须使用什么来代替最后一个命令来获取想要的元素?
我不是在寻找解决方法(我已经找到了)。我想要的是 WWW::Mechanize、HTML::Tree 或任何其他 cpan-modul 的原生函数。
【问题讨论】:
-
为什么一定要找红香蕉而不是找正方形?
-
我正在搜索 1000 多个网站的数据。它们都具有相同的结构。在我的简化示例文档中,“red Banana”是一个修复文本和一个存在于所有 1000 多个文档中的修复类。变化的(以及我试图提取的)在我的示例中是“正方形”和“圆形”)。您可以将“red + Banana”视为键,将“square”视为值。
-
你可以忘记
WWW::Mechanize,只写my $root = HTML::TreeBuilder->new_from_url($uri)
标签: perl mechanize www-mechanize html-tree