前提
WebページにRSSが無いので、Webページをスクレイピングして新着ニュースをメールで送信しようと考えています。
ニュース部分をHTMLから切り出す為にNode.jsでXPathを利用してプログラムを作っています。
実現したいこと
NodeJSでXPathを利用したい。
発生している問題・エラーメッセージ
「n個の要素が見つかりました」(nは0以上)と表示される事を期待しているが、「0個の要素が見つかりました」と表示されてしまう。
該当のソースコード
javascript
1const fetch = require('node-fetch') 2const xpath = require('xpath') 3const parse5 = require('parse5') 4const xmlser = require('xmlserializer') 5const DOMParserDom = require('xmldom').DOMParser; 6 7(async () => { 8 const url = 'https://gundamevolution.jp/news/' 9 const res = await fetch(url) 10 const text = await res.text() 11 12 const document = parse5.parse(text) 13 const xhtml = xmlser.serializeToString(document) 14 const doc = new DOMParserDom().parseFromString(xhtml) 15 const select = xpath.useNamespaces({ 'x': 'https://www.w3.org/1999/xhtml' }) 16 const items = select('//x:a[contains(@class, "news-list__item")]', doc) 17 console.log(`${items.length}個の要素が見つかりました`) 18 19 // 実行結果 20 // 0個の要素が見つかりました 21})()
試したこと
- fetchで取得したHTMLに問題がないかを確認したが、ニュースのタイトルなどがout.htmlで確認出来たので問題ないと判断した。
diff
1+ const fs = require('fs'); 2+ fs.writeFileSync('out.html', text)
- 簡単なXPathに置き換えてXPathの動作確認をしたが、「0個の要素が見つかりました」が表示された。
diff
1- const items = select('//x:a[contains(@class, "news-list__item")]', doc) 2+ const items = select('//x:a', doc)
- 別のWebサイトでXPathの動作確認をしたが、「0個の要素が見つかりました」が表示された。
diff
1- const url = 'https://gundamevolution.jp/news/' 2+ const url = 'http://example.com' 3 4- const items = select('//x:a[contains(@class, "news-list__item")]', doc) 5+ const items = select('//x:a', doc)
補足情報(FW/ツールのバージョンなど)
- Windows 11 21H2
$ node --version v16.14.2
package.json
1"dependencies": { 2 "node-fetch": "^2.6.0", 3 "parse5": "^7.1.1", 4 "xmldom": "^0.6.0", 5 "xmlserializer": "^0.6.1", 6 "xpath": "^0.0.32" 7}
参考
https://qiita.com/ledsun/items/0965a60f9bdff04f2fa0#xpath-parse5

回答1件
あなたの回答
tips
プレビュー