Amazon 再調査

Amazon で ISBN を抜く。前からやってるけど改めて。ASIN だと CD とかでも抜けちゃうのでいや。
XPathではこんなん。

>>> var text = document.evaluate(
      '//div[@class="content"]/ul/li[b/text()="ISBN-13:"]/text()', document, null, XPathResult.STRING_TYPE, null);
>>> var isbn13x = text.stringValue.replace(/[\s-]/g, '');
>>> isbn13x;
"9784873113227"

正規表現ではこんなん。

>>> document.body.innerHTML.match(/<b>ISBN-13:<\/b>\s*(\d{3})-(\d{9}[\dX])/);
["<b>ISBN-13:</b> 978-4873113227", "978", "4873113227"]
>>> var isbn13r = RegExp.$1 + RegExp.$2;
>>> isbn13r;
"9784873113227"

で、

ブラウザのネイティブの XPath ってどうよ?
 ・ここまで、パフォーマンスがいいとは思わなかった!XPath 最強!いやまじで!だって、「これ普通に処理したらどんだけ重いんだよ」って処理だって XPath だと 0.2 ms とかで出来ちゃうんだもん!

XPath は実用に耐えうるかの考察と xpath.js - IT戦記

とのことなので比較してみた。firebug ね。

>>> console.time('regexp'); for (var i = 0; i < 100; ++i) { /* regexp */ }; console.timeEnd('regexp');
regexp: 2841ms
>>> console.time('xpath'); for (var i = 0; i < 100; ++i) { /* xpath */ }; console.timeEnd('xpath');
xpath: 280ms

うはw。10倍以上違うよ!と、思ったけど、document.body.innerHTML が時間食ってるだけだった…。

>>> console.time('innerHTML'); for (var i = 0; i < 100; ++i) { document.body.innerHTML; }; console.timeEnd('innerHTML');
innerHTML: 2513ms

document.body.innerHTML をループの外でやれば同じくらい。
当然ケースによるけど、XPath のパフォーマンスが予想以上にいいのは間違いない。どんどん使っちゃお。