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

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

新規登録して質問してみよう
ただいま回答率
85.48%
XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2291閲覧

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

fukazume

総合スコア78

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

0クリップ

投稿2018/10/25 05:14

編集2018/10/25 05:53

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

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

HTML要素

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()
sassoon👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukazume

2018/10/25 07:00 編集

ありがとうございます!おっしゃる通り、user agentを指定して実行すると正常に抽出できました!各リンクや "response.body_as_unicode()" も大変参考になりました。 最後に、もしよろしければ大変しょーもないことで恐縮なのですが、コード文頭の In [1]: や Out[1] という表示はどういう開発環境で現れるものなのでしょうか? 私はMacでTerminal もしくは iTerm2でPython/Scrapyを学び始めたのですが、上記表示は他の技術ブログなどでも散見されていましたので、漠然と疑問に思っていました。 ちなみに私の環境では >>> response.xpath......... みたいな文頭の表示です。しょーもなくてすみません。
fukazume

2018/10/25 10:38

大変参考になります。ちなみに「コード文頭の In [1]: や Out[1] という表示」という関連質問はいかがでしょうか(^_^;)
quickquip

2018/10/25 11:18

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

2018/10/25 12:33

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

2018/10/25 12:46

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

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
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukazume

2018/10/25 05:39 編集

ありがとうございます!しかしながら当質問の意図は「ScrapyというPythonフレームワークによるXpathで指定したa要素のテキスト抽出」であり、ご提示いただきました「ChromeデベロッパーツールでのHTML要素の選択方法」とは違う内容と理解していますが、いかがでしょうか。
tiitoi

2018/10/25 06:16

HTML を保存してみてみたところ、Javascript が動かないブラウザと判断されて弾かれていました。
fukazume

2018/10/25 06:32

tiitoiさん、再度検証いただき、ありがとうございます。上記の説では、/html/head/title が正常に抽出できる点は説明可能なのでしょうか?私もこのあと、他のbody要素でxpathテキスト抽出をやってみますが、取り急ぎ、疑問に思った点をコメいたします。
tiitoi

2018/10/25 06:34

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

2018/10/25 07:01

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

2018/10/25 07:24 編集

状況を整理すると、Yahoo 側にユーザーエージェントかなんかをチェックして、Yahoo を利用するために必要なバージョンを満たしていないブラウザでアクセスした場合は、通常表示されるページではなく、「あなたのブラウザではYahooは見れませんよ」というページに飛ばす仕組みになっていました。 Scrapy でデフォルトの状態では、対応してないブラウザと判断されてそちらのページに飛ばされていました。 そのページには title 要素「Yahoo Japan」はあるため、そちらはスクレイピングできるが、ヤフオクの文字が取得できる要素はないため、そちらは空になっていました。 解決策としては、quiqui さんの回答の通り、最近のブラウザのユーザーエージェントを指定すればよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問