ошибка выхода индекса списка за пределы диапазона при выполнении алгоритма веб-очистки

#python #web-scraping #jupyter-notebook

Вопрос:

Я написал программу на python для очистки веб-страниц в записной книжке jupyter:

 from bs4 import BeautifulSoup 
import requests 
page = requests.get(url)
#Store the contents of the website under doc
doc = lh.fromstring(page.content)
#Parse data that are stored between <tr>..</tr> of HTML
tr_elements = doc.xpath('//tr')
r = requests.get(url)
#Create empty list
col=[]
i=0
#For each row, store each first element (header) and an empty list
for t in tr_elements[0]:
    i =1
    name=t.text_content()
    print ('%d:"%s"'%(i,name))
    col.append((name,[]))
 

Это приводит меня к ошибке:

Ошибка
индекса —> 16 для t в tr_elements[0] Ошибка индекса: индекс списка вне диапазона

Как устранить эту ошибку?

Я также прикрепляю ссылку на блокнот jupyter: https://github.com/chirayupd/Mumbai_Neighbourhood_Analytics/blob/main/Neighbourhood.ipynb

Комментарии:

1. Ошибка, указывающая на отсутствие элемента в этом индексе. т. е. список пуст. То, что у тебя есть tr_elements . Также может помочь редактирование полного фрагмента.

2. Можете ли вы поделиться URL-адресом?

3. github.com/chirayupd/Mumbai_Neighbourhood_Analytics/blob/main/…

Ответ №1:

Пара вещей.

Во-первых, вы могли бы просто захватить всю таблицу с пандами и .columns извлечь заголовки.

 import pandas as pd

df = pd.read_html('https://mumbai7.com/postal-codes-in-mumbai/')[0]
print(list(df.columns)) # print list(df.columns)
print(df) # print df
 

Во-вторых, requests вам нужен соответствующий заголовок агента пользователя, например

 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
 

В-третьих, tr_elements[0] посмотрите на первую строку, затем вы можете добавить дополнительный вызов для извлечения th элементов из этой строки; поэтому повторная запись может выглядеть следующим образом:

 import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://mumbai7.com/postal-codes-in-mumbai/', headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
soup = bs(r.content, 'lxml')
tr_elements = soup.select('tr')

col = []
i = 0

for th in tr_elements[0].select('th'): #  header row
    i =1
    name = th.get_text()
    print('%d:"%s"'%(i,name)) # print ('%d:"%s"'%(i,name))
    col.append((name,[]))
 

Теперь вы можете сократить это несколько следующим образом, используя селектор типов для извлечения только th элементов из одной таблицы на странице в сочетании с перечислением (от 1), чтобы устранить необходимость в переменной счетчика:

 import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://mumbai7.com/postal-codes-in-mumbai/', headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
soup = bs(r.content, 'lxml')

for i, th in enumerate(soup.select('th'), 1):
    print(i, th.text)
    print()