给出如下的HTML:
...more html above...
<div class="any_name">
<p>Element A goes here</p>
<p>Element B goes here</p>
</div>
...more html below...
我需要获取包含(例如)“A goes”文本的任何元素的xpath路由,并得到一些像:
/html/body/div[4]/div[2]/div/article/div/p
请注意,每种情况下结构可能不同,我需要搜索整个文档,每次都在寻找文本......
实际上我成功地获取了网络内容但是使用Web :: Scraper应用了这样的 // element [text()=“A goes”] 似乎没有工作。
如何使用内容获取此xpath路由?有任何想法吗?谢谢!
答案 0 :(得分:3)
您可以使用XML::Twig来获取该内容。我改变了你提供的xpath,使其更加模块化。
use strict; use warnings;
use feature 'say';
use XML::Twig;
my $twig = XML::Twig->new();
$twig->parse(<<_HTML_
<html><body>
<div class="any_name">
<p>Element A goes here</p>
<p>Element B goes here</p>
</div>
</body></html>
_HTML_
);
for my $letter (qw(A B C)) {
foreach my $t ($twig->get_xpath("//p[string()=~/$letter goes/]")) {
say $t->xpath;
}
}
您可以在xpath中使用正则表达式来查找与您的字母匹配的元素。 text()=
的{{}}在这种情况下不起作用,因为如果您使用XML::Twig
而不是=
,则=~ //
会与完整文本匹配。此外,正确的语法是string()
,而不是text()
。
get_xpath
方法返回元素列表。我在每个方法上使用xpath
方法,它将完整的xpath返回给元素。在我的情况下是:
/html/body/div/p[1]
/html/body/div/p[2]
C
没有匹配项,因为我没有将它放在HTML代码中。