Преобразование нескольких URL-адресов в panda df

#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) , чтобы получить столбец, к которому мы добавим текущее значение.