借助xpath,scrapy

时间:2018-09-28 19:38:06

标签: python scrapy

我正在使用scrapy爬行某些信息,但对数据的处理感到震惊。在for循环中,第一步是找到名为selectors的“根” xpath,然后对其进行循环。我的想法是,如果是ul的第一个选择器,那么它可以爬行第一个选择器的所有数据!相反,scrapy返回所有元素的数组。我将选择器变量用作“ THIS”

import Scrapy

class SecccionAmarillaSpider( scrapy.spider ):
 name="seccion_amarilla"
 start_urls = ['https://www.seccionamarilla.com.mx/resultados/hospitales/1']
 data = {}

  def parse( self, result ):
    selectors = result.xpath('//ul[@class="list"]/li')
    for selector in selectors:
     name = selector.xpath('//span[itemprop="name"]/text()').extract()
     phone = selector.xpath('//span[itemprop="telephone"]/text()').extract()
     #These data is stored in MySQL

Example 例如,在第一个循环中,我期望

name = 'Z'
phone = '( 81)8333 4662'
sql = "INSERT INTO TABLE VALUES('"+name+"','"+phone+"')"

相反,我在第一个循环中复习了

name = ['Z','Z-GAS']
phone = ['( 81)8333 4662', '(33)3668 3800']

所有循环都使用相同的数据,不遵守当前选择器吗?

为什么?

我无法在数组之间建立关系,因为有时选择器没有名称和/或电话,并且Scrapy不会返回None或null或empty。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题:

  1. 在XPath中,您应该使用带有@前缀的属性://span[@itemprop="name"]/text()
  2. 您应在for循环中使用相对XPath:.//span[@itemprop="name"]/text()
  3. 您应该使用.extract_first()方法而不是.extract()(返回列表)

因此,您的代码应遵循以下原则:

for selector in selectors:
    name = selector.xpath('.//span[@itemprop="name"]/text()').extract_first()
    phone = selector.xpath('.//span[@itemprop="telephone"]/text()').extract_first()
    ...