IndexError: список индексов вне диапазона с регулярным выражением - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь почистить данные по этой ссылке https://www.seloger.com/ и я получаю эту ошибку, я не понимаю, что не так, потому что я уже пробовал этот код раньше, и он работал

import re
import requests
import csv
import json


with open("selog.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["id", "Type", "Prix", "Code_postal", "Ville", "Departement", "Nombre_pieces", "Nbr_chambres", "Type_cuisine", "Surface"]) 


for i in range(1, 500):
   url = str('https://www.seloger.com/list.htm?tri=initial&idtypebien=1,2&pxMax=3000000&div=2238&idtt=2,5&naturebien=1,2,4&LISTING-LISTpg=' + str(i))
   r = requests.get(url, headers = {'User-Agent' : 'Mozilla/5.0'})
   p = re.compile('var ava_data =(.*);\r\n\s+ava_data\.logged = logged;', re.DOTALL)
   x = p.findall(r.text)[0].strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')
   x = re.sub(r'\s{2,}|\\r\\n', '', x)
   data = json.loads(x)
   f = csv.writer(open("Seloger.csv", "wb+"))


   for product in data['products']:
      ID = product['idannonce']
      prix = product['prix']
      surface = product['surface']
      code_postal = product['codepostal']
      nombre_pieces = product['nb_pieces']
      nbr_chambres = product['nb_chambres']
      Type = product['typedebien']
      type_cuisine = product['idtypecuisine']
      ville = product['ville']
      departement = product['departement']
      etage = product['etage']
      writer.writerow([ID, Type, prix, code_postal, ville, departement, nombre_pieces, nbr_chambres, type_cuisine, surface])

это ошибка:

Traceback (most recent call last):
File "Seloger.py", line 20, in <module>
x = p.findall(r.text)[0].strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')
IndexError: list index out of range

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Эта строка неверна:

x = p.findall(r.text)[0].strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')

что вам нужно найти в тексте?

для работы с текстом над строкой вам нужно изменить строку выше на:

x = r.text.strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')

и затем найти то, что вам нужно

0 голосов
/ 06 июня 2019

Ошибка возникает из-за того, что иногда нет совпадений, и вы пытаетесь получить доступ к несуществующему элементу в пустом списке. Тот же результат можно воспроизвести с помощью print(re.findall("s", "d")[0]).

Чтобы устранить проблему, замените строку x = p.findall(r.text)[0].strip().replace('\r\n ','').replace('\xa0',' ').replace('\\','\\\\') на

x = ''
xm = p.search(r.text)
if xm:
    x = xm.group(1).strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')

ПРИМЕЧАНИЯ

  • Когда вы используете p.findall(r.text)[0], вы хотите получить первое совпадение во входных данных, поэтому re.search лучше всего подходит здесь, поскольку оно возвращает только первое совпадение
  • Чтобы получить данные, захваченные в первой группе захвата, вам нужно использовать matchObject.grou[p(1)
  • if xm: важно: если совпадений нет, x останется пустой строкой, в противном случае ему будет присвоено измененное значение в группе 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...