例としてYahoo! Japanトップページで、以下イメージのように要素 li#mhi2nd をScrapyのshell、xpathで抽出しようとすると、[]という空(?)の値が返ってきます。一方、別のxpath(/html/head/title)では正常に抽出されます。
①この違いは何でしょうか?
②正常に li#mhi2nd のテキスト "ヤフオク!" を抽出できる方法をお教えください
scrapy
1scrapy shell https://www.yahoo.co.jp/
###抽出が失敗するXpath
scrapy
1>>> response.xpath('//*[@id="mhi2nd"]/a/text()').extract()
###抽出が成功するXpath
scrapy
1>>> response.xpath('/html/head/title/text()').extract()
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
ブラウザの種類やバージョンを判断しているので違うコンテンツが返ってきているだけです。
print(response.body_as_unicode())
してみると確認できます。古式ゆかしいtableレイアウトのページだと思います。
Scrapyの設定をChromeのものにでもすればいいのですね。
参考
https://doc.scrapy.org/en/latest/topics/settings.html#user-agent
https://doc.scrapy.org/en/latest/topics/settings.html#command-line-options
scrapy shell -s USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36' 'https://www.yahoo.co.jp/'
とかして起動すればいいかと。
結果
In [1]: response.xpath('//*[@id="mhi2nd"]/a/text()').extract() Out[1]: ['ヤフオク!']
投稿2018/10/25 06:33
総合スコア11038
0
XPath の意味は
//*[@id="mhi2nd"]/a/text()
id="mhi2nd" という属性を持つ任意の要素の子 a の値です。
/html/head/title/text()
はルートから html の子の head の子の title 要素の値です。
ちなみに Chrome で F12 で開発者ツール開いて、Ctrl+F とすると XPath を入力する欄が出てくるので、それで選択される要素を確認できます。
前者の Xpath でもちゃんとヤフオクが選択されましたよ。
XPath についてはこちらを参考にするとよいかと思います。
追記
XPath 自体はあっていることを示すために上記のことを紹介しました。
以下のコードで取得した HTML を保存したところ、
with open('test.html', 'w') as f: f.write(response.body.decode("utf-8"))
Yahoo Japan を見るための環境を満たしていないと判断され、弾かれています。
なので、ブラウザでアクセスしたときの HTML は取得できていないため、上記の XPath が指す要素も存在しませんでした。
<nobr>Yahoo! JAPANトップページの機能を正しくご利用いただくには、下記の環境が必要です。</nobr><br> Windows:Internet Explorer 11.0以上 / Chrome 最新版 / Firefox 最新版 / Microsoft Edge Macintosh:Safari 9.0以上<img src="//s.yimg.jp/images/clear.gif" alt="" width="1" height="15"><br> ※Internet Explorer 11.0以上をご利用の場合は、「<a href="https://www.yahoo-help.jp/app/answers/detail/p/533/a_id/43883">Internet Explorerの互換表示について</a>」を参考に、互換表示の無効化をお試しください。<img src="//s.yimg.jp/images/clear.gif" alt="" width="1" height="15"><br><img src="//s.yimg.jp/images/clear.gif" alt="" width="1" height="15">
投稿2018/10/25 05:25
編集2018/10/25 06:15総合スコア21956
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 06:16
2018/10/25 06:32
2018/10/25 06:34
2018/10/25 07:01
2018/10/25 07:24 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 07:00 編集
2018/10/25 07:09
2018/10/25 10:38
2018/10/25 11:18
2018/10/25 12:33
2018/10/25 12:46