Scrapy:使用带编号的Div和&amp ;;定义XPath。动态命名项目字段

时间:2015-04-09 10:12:17

标签: python scrapy items

我是关于Scrapy和Python的新手。非常感谢一些帮助...

我正在抓一个使用div的网站,而且我的生活无法解决为什么这不起作用。我只能填充Field1和Data1 ......总体计划是每页得到10分......

看看我的蜘蛛 - 我无法正确填充field2或data2 ......

import scrapy
from tutorial.items import AttorneysItem

class AttorneysSpider(scrapy.Spider):
    name = "attorneys"
    allowed_domains = ["attorneys.co.za"]
    start_urls = [
        "http://www.attorneys.co.za/CompanyHomePage.asp?CompanyID=537",
        "http://www.attorneys.co.za/CompanyHomePage.asp?CompanyID=776",
    ]

    def parse(self, response):
        for sel in response.xpath('//div//div//div[3]//div[1]//div//div'):
            item = AttorneysItem()
            item['Field1'] = sel.xpath('//div//div//div[3]//div[1]//div[1]//div[1]/text()').extract()
            item['Data1'] = sel.xpath('//div//div//div[3]//div[1]//div[1]//div[2]/text()').extract()
            item['Field2'] = sel.xpath('//div//div//div[3]//div[1]//div[2]//div[1]/text()').extract()
            item['Data2'] = sel.xpath('//div//div//div[3]//div[1]//div[2]//div[2]/text()').extract()
            yield item

非常令人沮丧。该网站的链接是http://www.attorneys.co.za/CompanyHomePage.asp?CompanyID=537

由于 稻谷

-------------- UPDATE ---------------------------

所以我有点进一步,但再次碰壁。

我现在可以选择好的元素,但我不知何故需要动态定义项目字段...我能够做的最好的是下面的,但它不是很好,因为字段的数量不一致,而且并不总是以相同的顺序。基本上我的说法有时他们的网站被列为第三个字段,有时它是第五个字段。

def parse(self, response):
    item = AttorneysItem()
    item['a01Firm'] = response.xpath('//h1[@class="name-h1"]/text()').extract()
    item['a01Field'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[0].strip()
    item['a01Data'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[0].strip()
    item['a02Field'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[1].strip()
    item['a02Data'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[1].strip()
    item['a03Field'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[2].strip()
    item['a03Data'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[2].strip()
    item['a04Field'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[3].strip()
    item['a04Data'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[3].strip()

再次感谢所有可以提供帮助的人:D

1 个答案:

答案 0 :(得分:0)

您提供的xpath存在多个问题:

  • 你只需要在开头使用“//”,其余的应该是“/".
  • 仅使用元素名称提取不干净。它导致可读性差,可能性能不佳。一个原因是许多(如果不是大多数)网页包含嵌套div的级别。相反,要充分利用selectors

此外,您不需要for循环。

一种更简洁的方法如下:

item = AttorneysItem()
    item['Field1'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[0]
    item['Data1'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[0]
    item['Field2'] = response.xpath('//div[@class="col-lg-3 display-label"]/text()').extract()[1]
    item['Data2'] = response.xpath('//div[@class="col-lg-9"]/text()').extract()[1]
    yield item

如果您不知道,可以使用scrapy shell来测试您的xpath。 只需在命令行中输入scrapy shell url,其中url对应于您正在抓取的网址。