XHRで取ってきた文字列としてのHTMLに対して、XPath使ってデータを取るのがなんとかできた。
Firefox以外では動かないと思うけど、今回はGreasemonkey用なので気にしない。
- document.implementation.createDocumentを使ってDocumentをつくる
- RangeのcreateContextualFragmentを使ってDocumentFragmentをつくる
- 最初に作ったDocumentにDocumentFragmentを付ける
- そのDocumentに対してXPathを使う
まだ雑だけど、そのへんのコードはこんな感じ。
function load(data) { var v = data.responseText.replace(/<html.*?>/, '') v = v.replace(/<\/html>/, '') var ns = 'http://www.w3.org/1999/xhtml' var doc = document.implementation.createDocument(ns, 'html', null) var html = doc.documentElement var body = doc.createElementNS(ns, 'body') html.appendChild(body) var range = document.createRange() range.setStartAfter(document.body) var df = range.createContextualFragment(v) body.appendChild(df) request_url = get_first_by_xpath(config.next_xpath, doc).href var page = get_first_by_xpath(config.page_xpath, doc) var hr = doc.createElementNS(ns, 'hr') var p = doc.createElementNS(ns, 'p') p.appendChild(doc.createTextNode('page: ' + ++page_num)) insert_elem.parentNode.insertBefore(hr, insert_elem) insert_elem.parentNode.insertBefore(p, insert_elem) insert_elem.parentNode.insertBefore(page, insert_elem) busy(false) }
でも少しルートのへんがおかしくて、/htmlとか/html/bodyとかがうまくマッチしないんだけど、
とりあえず疲れたのでこのへんにしとく。
ということで、これをつかったバージョンにアップデートしました。
AutoPagerize for Google
http://swdyh.yu.to/autopagerizeforgoogle.user.js
参考 新しく作成したXML文書でDOM HTMLを使う
http://www.akatsukinishisu.net/itazuragaki/xml/use_dom_html_in_xml.html