我正在使用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
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。
我该如何解决?
答案 0 :(得分:1)
您的代码中存在一些问题:
@
前缀的属性://span[@itemprop="name"]/text()
.//span[@itemprop="name"]/text()
.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()
...