質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

scrapy shell, response.xpath().extract()で抽出できない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,460

score 75

例としてYahoo! Japanトップページで、以下イメージのように要素 li#mhi2nd をScrapyのshell、xpathで抽出しようとすると、[]という空(?)の値が返ってきます。一方、別のxpath(/html/head/title)では正常に抽出されます。

①この違いは何でしょうか?
②正常に li#mhi2nd のテキスト "ヤフオク!" を抽出できる方法をお教えください

HTML要素

scrapy shell https://www.yahoo.co.jp/

抽出が失敗するXpath

>>> response.xpath('//*[@id="mhi2nd"]/a/text()').extract()

抽出が成功するXpath

>>> response.xpath('/html/head/title/text()').extract()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ブラウザの種類やバージョンを判断しているので違うコンテンツが返ってきているだけです。

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 20:18

    それはiPythonのプロンプトですよ

    キャンセル

  • 2018/10/25 21:33

    ipythonをインストールしてipythonコマンドを実行するとiPythonの対話環境になります。

    キャンセル

  • 2018/10/25 21:46

    そうでしたか。100%理解できました。大変勉強になりました。改めて感謝申し上げます!

    キャンセル

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 15:34

    上記のHTMLは一部抜粋です。「Yahoo! JAPANトップページの機能を正しくご利用いただくには、下記の環境が必要です。」というページが表示されたときでも、<title>Yahoo! JAPAN</title> はHTMLに存在しています。

    キャンセル

  • 2018/10/25 16:01

    ありがとうございます。ちょっとまだ理解できていないですが、参考にさせていただきますm(_ _)m

    キャンセル

  • 2018/10/25 16:22 編集

    状況を整理すると、Yahoo 側にユーザーエージェントかなんかをチェックして、Yahoo を利用するために必要なバージョンを満たしていないブラウザでアクセスした場合は、通常表示されるページではなく、「あなたのブラウザではYahooは見れませんよ」というページに飛ばす仕組みになっていました。
    Scrapy でデフォルトの状態では、対応してないブラウザと判断されてそちらのページに飛ばされていました。

    そのページには title 要素「Yahoo Japan」はあるため、そちらはスクレイピングできるが、ヤフオクの文字が取得できる要素はないため、そちらは空になっていました。

    解決策としては、quiqui さんの回答の通り、最近のブラウザのユーザーエージェントを指定すればよいです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る