1

スクレイピー セレクターを使用して Web からデータ テーブルをスクレイピングしようとしていますが、空の配列を取得しました。面白いことに、ファイルを保存してスクレイプしようとすると、予想される配列 (null 以外) が得られました。Scrapy のバージョン、セレクター コマンド、および予想される応答に関する情報は、以下にあります。

スクレイピーバージョン

Scrapy  : 0.18.2
lxml    : 3.2.3.0
libxml2 : 2.9.0
Twisted : 13.1.0
Python  : 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
Platform: Windows-8-6.2.9200

セレクタ

hxs.select('//table[contains(@class,"mnytbl")]//tbody//td[contains(@headers,"tbl\x34\x37a")]//span/text()').extract()

期待される反応

[u'\n1.26 Bil\n        \n', u'\n893.90 Mil\n        \n', u'\n924.87 Mil\n
 \n', u'\n1.18 Bil\n        \n', u'\n1.55 Bil\n        \n', u'\n2.91 Bil\n
  \n', u'\n3.96 Bil\n        \n', u'\n4.01 Bil\n        \n', u'\n3.35 Bil\n
   \n', u'\n2.36 Bil\n        \n']

<url>: http://investing.money.msn.com/investments/financial-statements?symbol=SPF

Web に接続するためのシェル コマンド

$ scrapy shell <url>

セレクターを実行すると、空の配列 ([]) が返されます。HTML 出力をファイル (例: C:\src.html) に保存し、セレクターを使用すると、期待どおりの応答が得られました。

どうも!

4

1 に答える 1

2

ヘッダーが「SALES」の 2 番目の列からセルを取得したいことは理解しています。

あなたの述語がどこから来たのかよくわかりません..のcontains(@headers,"tbl\x34\x37a")動的に生成された「ヘッダー」属性が原因であると思いますtd.

このかなり厄介な XPath 式を試してみることをお勧めします

    //div[div[contains(span, "INCOME STATEMENT")]]
        //table[contains(@class,"mnytbl")]/tbody/tr
           /td[
               position() = (
                       count(../../../thead/tr/th[contains(., "SALES")]
                                        /preceding-sibling::th)
                       + 1
                   )
               ]

これは、要素の位置を決定するためにxpath を使用してノードの位置を検索から借用します

説明:

  • 最初に最初のテーブルを見つけます:divを含む内で、 "INCOME STATEMENT"divを含む...span
  • 次に、値が「SALES」のいとこのセルの位置と同じtdセルを見つけますposition()th
  • ../../..tdgrand-grand-parent に戻ることです。これは(最初の祖先)tableによって単純化できます。ancestor::table[1]table

したがって、最初のテーブルのすべての行の各 2 番目のセルでスパン内のテキスト要素を取得するには、次のようになります。

hxs.select("""
    //div[div[contains(span, "INCOME STATEMENT")]]
        //table[contains(@class,"mnytbl")]/tbody/tr
           /td[
               position() = (
                       count(ancestor::table[1]
                                 /thead/tr/th[contains(., "SALES")]
                                          /preceding-sibling::th)
                       + 1
                   )
               ]/span/text()
""").extract()
于 2013-09-23T21:30:52.857 に答える