我正在使用Scrapy抓取一个网站,其上有一个项目列表。但是,当循环遍历项目列表时,要求相对xpath将返回整个页面的所有匹配项。我一直在使用0.24,但升级到最新版(1.0)遇到了同样的问题。
我尝试使用virtualenv
运行此操作,以避免与我系统上的其他库发生冲突,但没有成功。
for sel in response.xpath('//ul[@class="items"]//div[@class="item"]'):
item = CrawledItem()
item['id'] = sel.xpath('.//input[@name="id"]/@value').extract()
我已经尝试使用scrapy parse
进行调试,并注意到id列表以所有匹配开始,然后慢慢减少,所以最后一项只匹配一个id。我期待每个项目有一个id,而不是我得到类似下面的响应。
[
{
'id': [1,2,3,4,5,6,7,8,9,10]
},
{
'id': [1,2,3,4,5,6,7,8,9]
},
[..] // omitted
{
'id': [10]
}
]
我也尝试过使用css选择器但没有成功。我的理解是.//
用于执行此操作。如何确保我只选择相对于当前选择器?
答案 0 :(得分:1)
如何确保我只选择相对于当前的选项 选择?
明智地选择你的选择; - )
事实上,该页面的行为与直觉相反,似乎相对选择不起作用。正如我检查过的那样,您可以使用以下代码获取productId
,该代码使用更深层次的嵌套选择器:
from scrapy import Spider
class TestSpider(Spider):
name= 'test_spider'
start_urls = ['http://www.sainsburys.co.uk/shop/gb/groceries/meat-fish/ham-82654-44']
def parse(self, response):
# print response.body
xpath_products = '//div[@class="addToTrolleyForm "]'
for sel in response.xpath(xpath_products):
src = sel.xpath('.//input[@name="productId"]/@value').extract()
print src
虽然没有为您的问题提供解决方案 - 抱歉,我建议您仔细检查回复。