4

ウェブサイトからデータをスクレイピングし、それを 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)
4

2 に答える 2

7

これがあなたが探しているものだと思います:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    divs = hxs.select('//tr[@class="someclass"]')
    for div in divs:
        item = TestBotItem()
        item['var1'] = div.select('./td[2]/p/span[2]/text()').extract()
        item['var2'] = div.select('./td[3]/p/span[2]/text()').extract() 
        item['var3'] = div.select('./td[4]/p/text()').extract()

        yield item

s をループしてからtr相対 XPath 式 ( ./td...) を使用し、各反復でyield命令を使用します。

次のように、各項目をリストに追加し、ループの外でそのリストを返すこともできます(上記のコードと同等です)。

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    divs = hxs.select('//tr[@class="someclass"]')
    items = []

    for div in divs:

        item = TestBotItem()
        item['var1'] = div.select('./td[2]/p/span[2]/text()').extract()
        item['var2'] = div.select('./td[3]/p/span[2]/text()').extract() 
        item['var3'] = div.select('./td[4]/p/text()').extract()

        items.append(item)

    return items
于 2013-10-31T13:43:28.793 に答える
4

必要ありませんHtmlXPathSelector。Scrapy には既に XPATH セレクターが組み込まれています。これを試して:

def parse(self, response):
    divs = response.xpath('//tr[@class="someclass"]')
    for div in divs:
        item = TestBotItem()
        item['var1'] = div.xpath('table/tbody/tr[*]/td[2]/p/span[2]/text()').extract()[0]
        item['var2'] = div.xpath('table/tbody/tr[*]/td[3]/p/span[2]/text()').extract()[0] 
        item['var3'] = div.xpath('table/tbody/tr[*]/td[4]/p/text()').extract()[0]
        return item
于 2016-01-23T03:09:15.627 に答える