我想使用xpath和scrapy提取数据。这是我的代码:
def parse(self, response):
Coords = []
for sel in response.xpath('//*[@id="pitch"]/image[contains(@class,"success")]'):
item = PogbaItem()
item['x'] = sel.xpath('@x').extract()
item['y'] = sel.xpath('@y').extract()
item['x'] = sel.xpath('@x1').extract()
item['y'] = sel.xpath('@y1').extract()
Coords.append(item)
return Coords
问题是html包含两个不同的元素:第一个(image
)包含属性x,y
,另一个(line
)包含属性x1,y1
。我正在尝试将它们放在一起以获得最终的csv,但我找不到正确的xpath我该如何解决?
更新:HTML
的两个例子:
<image class="pitch-object timer-1-40 success" x="331.172" y="84.678" width="30" height="30" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/sites/fourfourtwo.com/modules/custom/statzone/files/icons/successful_clearance.png"></image>
<line class="pitch-object timer-2-84 success" marker-end="url(#smallblue)" x1="453.076" y1="199.169" x2="509.104" y2="216.676" style="stroke:blue;stroke-width:3"></line>
答案 0 :(得分:1)
根据我的理解,您希望x
值x
属性(如果存在)和x1
,y
同样适用于item['x'] = sel.xpath('@x').extract_first() or sel.xpath('@x1').extract_first()
item['y'] = sel.xpath('@y').extract_first() or sel.xpath('@y1').extract_first()
。我将如何解决这个问题:
item['x'] = sel.xpath('(@x|@x1)').extract_first()
item['y'] = sel.xpath('(@y|@y1)').extract_first()
或者,您可以使用纯XPath解决方案:
line
而且,由于您需要同时处理image
和//*[@id="pitch"]/*[contains(@class,"success")]
元素,因此应调整主表达式来处理:
//*[@id="pitch"]/*[(self::image or self::line) and contains(@class,"success")]
或者:
height