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.js - IT戦記
・ここまで、パフォーマンスがいいとは思わなかった!XPath 最強!いやまじで!だって、「これ普通に処理したらどんだけ重いんだよ」って処理だって XPath だと 0.2 ms とかで出来ちゃうんだもん!
とのことなので比較してみた。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 のパフォーマンスが予想以上にいいのは間違いない。どんどん使っちゃお。