#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()