从xpath scrapy双重选择

时间:2016-05-02 14:46:36

标签: xpath scrapy

我想使用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>

1 个答案:

答案 0 :(得分:1)

根据我的理解,您希望xx属性(如果存在)和x1y同样适用于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