在同一页面上使用两个xpathselectors

时间:2014-04-12 22:40:52

标签: python-2.7 xpath scrapy

我有一只蜘蛛,其中刮下的物品是3:品牌,型号和价格来自同一页。

品牌和型号使用相同的sel.xpath,稍后通过.re in循环提取和区分。但是,价格项目使用不同的xpath。如何在蜘蛛中使用或组合两个XPathSelectors?

示例:

品牌和型号:

titles = sel.xpath('//table[@border="0"]//td[@class="compact"]')

价格:

prices = sel.xpath('//table[@border="0"]//td[@class="cl-price-cont"]//span[4]')

通过xpath单独测试和导出。我的问题是将这两个结合起来构建正确的循环。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您以后可以区分所有3种商品(品牌,型号,价格),您可以尝试使用XPath union(|)将两个XPath查询捆绑到一个选择器中:

//table[@border="0"]//td[@class="compact"] 
    | 
//table[@border="0"]//td[@class="cl-price-cont"]//span[4]

更新:

回复你的评论,上面的意思是单个XPath字符串。我没有使用python,但我认为它应该是这样的:

sel.xpath('//table[@border="0"]//td[@class="compact"] | //table[@border="0"]//td[@class="cl-price-cont"]//span[4]')

答案 1 :(得分:1)

我相信你在将价格与品牌/型号联系起来时遇到了麻烦,因为两条x路径都会给你一个所有数字的列表,对吗?相反,你想要做的是构建一个xpath,它将获取表的每一行。然后,在循环中,您可以执行进一步的xpath查询以获取make / model / price。

rows = sel.xpath('//table[@border="0"]/tr')  # Get all the rows
for row in rows:
    make_model = row.xpath('//td[@class="compact"]/text()').extract()
    # set make and model here using your regex. something like:
    (make,model) = re("^(.+?)\s(.+?)$", make_model).groups()

    price = row.xpath('//td[@class="cl-price-cont"]//span[4]/text()').extract()

    # do something with the make/model/price.

通过这种方式,您知道在循环的每次迭代中,您获得的所有品牌/模型/价格都会合在一起。