#pandas #web-scraping
#панды #веб-очистка
Вопрос:
Нужна помощь в добавлении нескольких повторных обращений к panda df.
В настоящее время я получаю вывод только с одного из URL-адресов в DF.
Я не указал URL-адреса, если они вам понадобятся, я предоставлю их вам.
##libs
import bs4
import requests
import re
from time import sleep
import pandas as pd
from bs4 import BeautifulSoup as bs
##webscraping targets
URLs = ["URL1","URL2","URL3"]
## Get columns
column_list = []
r1 = requests.get(URLs[0])
soup1 = bs(r1.content)
data1 = soup1.find_all('dl', attrs= {"class": "border XSText rightAlignText noMarginTop highlightOnHover thickBorderBottom noTopBorder"})
columns = soup1.find_all('dt')
for col in columns:
column_list.append(col.text.strip()) # strip() removes extra space from the text
##Get values
value_list = []
for url in URLs:
r1 = requests.get(url)
soup1 = bs(r1.content)
data1 = soup1.find_all('dl', attrs= {"class": "border XSText rightAlignText noMarginTop highlightOnHover thickBorderBottom noTopBorder"})
values = soup1.find_all('dd')
for val in values:
value_list.append(val.text.strip())
df=pd.DataFrame(list(zip(column_list,value_list)))
df.transpose()
Текущий вывод, показывающий только повторные запросы одного URL:
Комментарии:
1. Из чего выводится результат
zip(column_list,value_list)
? Не могли бы вы указать URL-адреса, чтобы мы могли взглянуть?
Ответ №1:
Проблема здесь в вашей zip
функции. Он будет заархивировать значения только до длины самого короткого списка, в данном случае column_list
. Оставляя все остальные значения неиспользованными.
Если вы хотите также добавить другие значения к фрейму данных, вам придется повторить итерацию. Так что измените последние две строки в вашем коде на это, и это должно сработать:
result = [[i] for i in column_list]
for i, a in enumerate(value_list):
result[i % len(column_list)].extend([a])
df = pd.DataFrame(result)
df.transpose()
Комментарии:
1. Еще раз привет. это решило проблему, но я не совсем понимаю код. не могли бы вы, пожалуйста, объяснить подробнее?
2. Конечно. В первой строке мы создаем вложенный список с именем result . Внутри этого списка есть несколько списков только с одним именем столбца. Мы делаем это, чтобы позже добавить другие значения. Затем в цикле for мы используем
enumerate
функцию, чтобы получить индекс и значение для каждого элементаvalue_list
. Затем мы добавляем каждое значение к соответствующему имени столбца в соответствии с индексом. Теперь в каждом списке внутриresult
списка у нас есть имя столбца плюс каждое значение, которое вы отбросили для этого столбца.3. Мы используем
i % len(column_list)
, чтобы получить столбец, к которому мы добавим текущее значение.