非常新的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()
答案 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