Web::Scraper + XML::LibXML

via http://b.hatena.ne.jp/mattn/20071016#bookmark-6186564
scraper シェル上で組み合わせたら便利なのではと思い試してみた。

$ cat foo.html 
<html>
<body>
<div><span>aaa</span>bbb</div>
<div><span>ccc</span>ddd</div>
</body>
</html>
$ scraper foo.html

とりあえず抽出したいテキストを使ったりしてノードを特定し、そのノードを表す XPath を表示する。

scraper> use XML::LibXML
scraper> warn $_->nodePath foreach (
    XML::LibXML->new->parse_string($tree->as_XML)->findnodes('//node()[.="bbb"]'))
/html/body/div[1]/text() at (eval 46) line 1.

あとはその XPath を使っていつもどおり。

scraper> process '/html/body/div[1]/text()', WARN
bbb at /usr/bin/scraper line 18.

scraper> process '/html/body/div/text()', WARN   
bbb at /usr/bin/scraper line 18.
ddd at /usr/bin/scraper line 18.

理想はこんなんかな。

scraper> process '//node()[.="bbb"]', XPATH
/html/body/div[1]/text() at (eval 46) line 1.

使ってるモジュールが違うので簡単にはできそうもないけど。