これはおそらく非常に概念的な質問であり、スタック オーバーフローにはスクレイピーと Xpath の構築に関する豊富なリソースがありますが、これに具体的に答えるものは何も見つからなかったので、質問します。
Firebug と XPath チェッカーを使用して (Python で) Scrapy 用の XPath 式を(独立して) 構築しているときに、Xpath を構築する 2 つの異なる方法があります。特定の Xpath/HTML 階層については、関心のある要素を抽出/スクレイピングできるようにするために、XPath を構築する方法が多数考えられることを知っています。また、絶対/相対 Xpath (Firepath で) を生成できることも理解しています。
すなわち -
ユースケースの例-- eBay でページをスクレイピングしようとする
スクレイピーシェルhttp://www.ebay.com/sch/Coats-Jackets-/57988/i.html
-- Xpath チェッカーの使用 -- [XPath から tbody を削除した後、正常に動作します]]
Xpath = id('ResultSetItems')/table/tbody/tr/td/div/div/div/div/div/h4/a/text() hxs.select("id('ResultSetItems')/table/tr/ td/div/div/div/div/div/h4/a/text()").extract()
-- Firepath で相対パスを使用する -- [動作、OK、XPath から tbody を削除した後]
XPath = .// [@id='ResultSetItems']/table[1]/tbody/tr/td[1]/div/div/div/div/div[2]/h4/a/@href hxs.select (".// [@id='ResultSetItems']/table[1]/tr/td[1]/div/div/div/div/div[2]/h4/a/@href").extract( )
-- Firepath で絶対パスを使用する -- [XPath から tbody を削除しても機能しない]
XPath = =html/body/div[5]/div[2]/div[3]/div[1]/div/div/div[2]/div/div[6]/div/table[1]/ tbody/tr/td[1]/div/div/div/div/div[2]/h4/a/@href hxs.select("html/body/div[5]/div[2]/div[3 ]/div[1]/div/div/div[2]/div/div[6]/div/table[1]/t>r/td[1]/div/div/div/div/div[2 ]/h4/a/@href").extract()は、tbody を削除した後でも機能しません
XPath から "tbody" を明示的に削除した後にのみ応答が表示されることに注意してください。ただし、これは Firepath を介して生成された絶対パスには当てはまりません。
Q1: なぜ "tbody" を削除する必要があるのですか?また、Firefox が XPath の途中に追加/挿入する他の要素がある場合は、tbody 以外に、応答を取得する (hxs.select を使用して)/ビルドする前に削除する必要があります。アイテム パイプライン。
私が見つけた考えられる説明:「特にFirefoxは、テーブルに要素を追加することで知られています。一方、Scrapyは元のページのHTMLを変更しないため、使用するとデータを抽出できなくなりますあなたのXPath 式。
Q2: FirePath ペインで絶対パスを読み取ると、tbody を削除した後でも応答が機能しません。なぜですか?
Q3 : Firebug と XPath チェッカーの 2 つのうち、どちらがよりうまく機能するか (より堅牢で一貫性のあるものを読む) のベスト プラクティスはありますか?
Q4無関係 : XPath をビルドする際にブラウザーで Javascript を無効にすることを推奨する人もいますが、これは関係があり、JavaScript を無効にするのが標準的な方法ですか? スクレイピング中に(もしあれば)そうしないと、どのような影響がありますか?
関連 - XPath、Python、および Scrapy を使用して HTML を解析するテーブル内の Xpath テーブル