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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

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

2666閲覧

Python, Scrapy shellでiframe内のHTML要素を抽出したい

fukazume

総合スコア78

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

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で作成されています。

0グッド

0クリップ

投稿2018/11/06 04:27

編集2018/11/06 04:29

###■経緯

  1. こちらのページで、Chromeデベロッパーツールの右クリックでiframe内HTML要素**<td class="XXXXX">A1</td>**のXPathを取得できませんでした
  2. scrapy-splashを用いて、にScrapy shellで1)のページにアクセス
  3. javascriptで描画されたiframe内の要素のsrcまでは、以下のコマンドで抽出できました

PythonScrapy

1In [16]: response.xpath('//iframe/@src').extract() 2Out[16]: [u'https://s.codepen.io/boomerang/iFrameKey-8f533f14-0308-57a0-4158-e044171e599d/index.html']

###■質問
iframe内で描画されているHTML要素**<td class="XXXXX">A1</td>**をScrapy shellのresponse.xpathで抽出できるXPathを教えていただきたいです。

HTML

1<!-- iframe内 --> 2<tbody> 3 <tr> 4 <td class="XXXXX">A1</td> 5 <td>B1</td>

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

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

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

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

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

mather

2018/11/06 04:45

iframeとはページ内に別のページをロードする仕組みであって、表示しているのはURLで呼び出された別のHTMLであることはご存知ですか?
fukazume

2018/11/06 04:48

ご指摘ありがとうございます。その場合、「別のHTML」内要素のXPathを取得する方法を上記例でご教示いただけますでしょうか?
mather

2018/11/06 04:53

ご存知ですか?に「はい」または「いいえ」で答えていただくことで現時点での理解を確認したいのですが。
fukazume

2018/11/06 04:59

次の理解ステップは何になりますでしょうか?
tiitoi

2018/11/06 05:23

iframe の HTML 自体も動的に生成されてるものなので、Scrapy で取るのは無理かと。スクレイピングでとれるのは基本的に最初から HTML 内に存在するものだけです。
fukazume

2018/11/06 05:33 編集

tiitoiさん、ありがとうございます。その「動的」な部分がネックなんだと想像しています。なのでsrcまでたどり着けたところでその先のアドバイスを頂ければと思い、質問させていただきました。英語では以下のようにparse出来る旨、書かれていますがいかがでしょうか。または、こちらの例は静的なページ限定とかでしょうか。 https://stackoverflow.com/questions/24301376/can-scrapy-scrape-contents-of-iframe-using-scrapy-alone/24302223#24302223
tiitoi

2018/11/06 05:46 編集

iframe は別の HTML が埋め込まれているだけなので、その HTML 自体が最初から存在していればとれますが、動的に生成したものであれば無理です。上記の例は静的な場合の話になります。 やはり、ブラウザでアクセスしたときと同一のHTMLにアクセスしたいのであれば、selenium を使ったほうがよいのではないでしょうか?
fukazume

2018/11/06 06:16 編集

tiitoiさん、私は非エンジニアでScrapyに出会ったばかりでSeleniumについては学習が追いついていません泣 しかしながら違うアプローチのアドバイスは大変ありがたいです。 お手数ですが上記のコメを回答欄にコピペ(=移動)いただけますでしょうかm(_ _)m teratailコミュニティにもきっと有益なはずですので
tiitoi

2018/11/06 07:11

コピペしました。
guest

回答2

0

ベストアンサー

コピペしました。

iframe は別の HTML が埋め込まれているだけなので、その HTML 自体が最初から存在していればとれますが、動的に生成したものであれば無理です。上記の例は静的な場合の話になります。 やはり、ブラウザでアクセスしたときと同一のHTMLにアクセスしたいのであれば、selenium を使ったほうがよいのではないでしょうか?

投稿2018/11/06 07:10

tiitoi

総合スコア21956

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

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

fukazume

2018/11/06 15:12

Seleniumでも引き続き難しそうですが、ヒントいただきました。ありがとうございました!
guest

0

スクレイピングとは「HTMLを取得して」「HTMLを解析して」「欲しいデータを抽出する」という流れですので、「HTMLを取得して」から再度やる必要がありますよね。

追記

おそらく index.html を取得するより前に

  • セッションを作成
  • 入力されたHTML, JS, CSS をロード
  • POSTリクエストをXHRで発行しサーバへ情報を送信
  • サーバ側でHTMLを作成
  • iframeを更新し生成されたページをロード

などのような手順になっているはずなので、いくつかの手順を擬似的に実施する必要があると思いますが、
実際どういう手順でやればいいのかはCodePenのサービスによるものなので僕にはわかりません。
JavaScriptコードを解析するしかなさそうです。

もう一つ追記

https://codepen.io/anon/pen/oQgVoJ
にアクセスしたときのレスポンスにHTMLエスケープされたHTMLコードがちゃんと送られてきていますね。
こっちを解析したほうが手っ取り早そうです。

投稿2018/11/06 05:17

編集2018/11/06 08:40
mather

総合スコア6753

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

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

mather

2018/11/06 05:46

srcまでは取得って書いてますが、そのsrcをたどってHTMLを取得しても何も表示されないんですか? 言わずもがな、ってなんでしょう。その情報を得ていない側からすると何もコメントできないのですが。 ではtbodyタグは一体どうやって見つけてるんですか?
mather

2018/11/06 05:55

おそらく index.html を取得するより前に - セッションを作成 - 入力されたHTML, JS, CSS をロード - POSTリクエストをXHRで発行しサーバへ情報を送信 - サーバ側でHTMLを作成 - iframeを更新し生成されたページをロード などのような手順になっているはずなので、いくつかの手順を擬似的に実施する必要があると思いますが、 実際どういう手順でやればいいのかはCodePenのサービスによるものなので僕にはわかりません。
fukazume

2018/11/06 06:09

>そのsrcをたどってHTMLを取得しても何も表示されないんですか? >情報を得ていない側からすると >tbodyタグは一体どうやって見つけてるんですか? ↑ これら全て、質問文の文脈ではじめから説明されていますが。現にtiitoiさんにはその旨が通じていることが何よりの証左ですよね。またご回答以前に質問文と同等操作をされていないようですね、非常に残念です。なおtbodyは一瞬で見つかります。 また質問文に対応するように「実際どういう手順でやればいいのかはCodePenのサービスによるものなので僕にはわかりません。」というコメで回答欄を更新していただけますか?
mather

2018/11/06 06:53

更新しました。
fukazume

2018/11/06 15:11

ありがとうございます。ご回答追記の「HTMLエスケープされたHTMLコードがちゃんと送られてきていますね。こっちを解析したほうが手っ取り早そうです。」は、私も当初、その場しのぎ的には同じ印象を持ちました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問