如何从文本摘录中获取xpath路由

时间:2012-06-25 10:26:29

标签: html perl xpath scrapy

给出如下的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路由?有任何想法吗?谢谢!

1 个答案:

答案 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代码中。