ウェブサイトからデータをスクレイピングし、それを 3 つのフィールドに割り当て、.csv を生成します。正常に動作しますが、大きな問題が 1 つあります。すべてのフィールドには、テーブルの行ごとに区切られるのではなく、すべてのデータが含まれます。これは、ループが機能していないことが原因であると確信しており、xpath が見つかると、別の行を作成するのではなく、他の 2 つのフィールドのデータを取得する前に、すべての行のすべてのデータを取得するだけです。
def parse(self, response):
hxs = HtmlXPathSelector(response)
divs = hxs.select('//tr[@class="someclass"]')
for div in divs:
item = TestBotItem()
item['var1'] = div.select('//table/tbody/tr[*]/td[2]/p/span[2]/text()').extract()
item['var2'] = div.select('//table/tbody/tr[*]/td[3]/p/span[2]/text()').extract()
item['var3'] = div.select('//table/tbody/tr[*]/td[4]/p/text()').extract()
return item
* の付いた tr は、クロールする必要がある Web サイトのエントリごとに数が増え、他の 2 つのパスは下に挿入されます。これを編集して、たとえば //table/tbody/tr[3] のみの最初のデータ セットを取得し、3 つのフィールドすべてに格納してから //table/tbody/tr[4] などに移動するにはどうすればよいですか? ?
アップデート
正しく動作しますが、pipelines.py ファイルに検証を追加して、var1 が 100% を超えるレコードを削除しようとしています。以下のコードが間違っていると確信しています。また、「リターン」の代わりに「生成」すると、使用されているパイプラインが停止しますか?
from scrapy.exceptions import DropItem
class TestbotPipeline(object):
def process_item(self, item, spider):
if item('var1') > 100%:
return item
else:
raise Dropitem(item)