2

次のような 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 gos」テキストを含む要素の xpath ルートを取得し、次のようなものを取得する必要があります。

/html/body/div[4]/div[2]/div/article/div/p

構造はケースごとに異なる可能性があり、毎回テキストを探してドキュメント全体を検索する必要があることに注意してください...

実際、私は Web コンテンツを正常に取得しましたが、この//element[text()="A gos"] のようなものを Web::Scraper に適用してもうまくいかないようです。

コンテンツを使用してこの xpath ルートを取得するにはどうすればよいですか? 何か案は?ありがとう!

4

1 に答える 1

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]

CHTML コードに入れていないため、一致するものはありません。

于 2012-06-25T10:56:57.853 に答える