Scrapy - 抓住多个项目

时间:2016-02-13 04:34:55

标签: python xpath web-scraping scrapy

非常新的scrapy,所以请耐心等待。

首先,这是我的代码:

from scrapy.spider     import BaseSpider
from scrapy.selector     import HtmlXPathSelector
from usdirectory.items    import UsdirectoryItem
from scrapy.http    import Request


class MySpider(BaseSpider):
    name         = "usdirectory"
    allowed_domains    = ["domain.com"]
    start_urls    = ["url_removed_sorry"]

    def parse(self, response):
        hxs     = HtmlXPathSelector(response)
        titles     = hxs.select('//*[@id="holder_result2"]/a[1]/span/span[1]/text()').extract()
        for title in titles:
                item = UsdirectoryItem()
                item["title"] = title
                item


        yield item

有效......但它只抓住第一项。

我注意到在我试图抓取的项目中,每行的Xpath都会发生变化。例如,第一行是您在上面看到的xpath:

//*[@id="holder_result2"]/a[1]/span/span[1]/text()

然后它增加2,一直到29.所以第二个结果:

//*[@id="holder_result2"]/a[3]/span/span[1]/text()

最后结果:

//*[@id="holder_result2"]/a[29]/span/span[1]/text()

所以我的问题是如何让脚本抓住所有这些,我不在乎是否必须为每个项目复制和粘贴代码。所有其他页面完全相同。我只是不确定该怎么做。

非常感谢。

编辑:

import scrapy
from scrapy.item import Item, Field

class UsdirectoryItem(scrapy.Item):
    title = scrapy.Field()

2 个答案:

答案 0 :(得分:1)

鉴于模式完全如您所述,您可以在mod的位置索引上使用XPath modulo operator a来获取所有目标a元素:

//*[@id="holder_result2"]/a[position() mod 2 = 1]/span/span[1]/text()

要快速演示,请考虑以下输入XML:

<div>
 <a>1</a>
 <a>2</a>
 <a>3</a>
 <a>4</a>
 <a>5</a>
</div>

鉴于此XPath /div/a[position() mod 2 = 1],将返回以下元素:

<a>1</a>
<a>3</a>
<a>5</a>

在xpathtester.com here

中查看实时演示

答案 1 :(得分:0)

如果这对您有用,请告诉我。请注意,我们正在迭代[i]而不是[1]。结果存储在一个列表中(希望如此)。

def parse(self, response):
    hxs = HtmlXPathSelector(response)

    for i in xrange(15):
        titles = hxs.select('//*[@id="holder_result2"]/a[' + str(1+i*2) + ']/span/span[1]/text()').extract()
        for title in titles:
                item = UsdirectoryItem()
                item["title"] = title
                item #erroneous line?
        items.append(item)
        yield item