цикл внутри "ЭТОГО" селектора с xpath, scrapy - PullRequest
0 голосов
/ 28 сентября 2018

Я использую scrapy, чтобы сканировать некоторую информацию, но я потрясен обработкой данных.В цикле for первым шагом является поиск корневого xpath с именем selectors, а затем цикл.Мой разум говорит, что если первый селектор, первый селектор ul, то я могу сканировать все данные первого селектора!Вместо этого scrapy возвращает массив всех элементов.Я использую переменную селектора как «ЭТО»

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, или пусто.

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 28 сентября 2018

В вашем коде есть некоторые проблемы:

  1. В XPath вы должны ссылаться на атрибуты с префиксом @: //span[@itemprop="name"]/text()
  2. Вы должны использовать относительный XPath вВаш цикл for: .//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()
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...