Web Scraping:如何将 for 循环中的行添加到数据框?

Web Scraping: how can I add rows in a for loop to dataframe?

我想从下面的 URL 中抓取一个 table。 抓取有效,但我遇到的问题是它只显示第一个 URL 的信息。我怎样才能修复我的代码,以便它也添加第二个 URL 的信息?我希望我的问题很清楚。

import pandas as pd
import requests
from bs4 import BeautifulSoup

urls = ['https://www.funda.nl/en/koop/ridderkerk/huis-42649106-natalstraat-15/', 'https://www.funda.nl/en/en/koop/rotterdam/huis-42648673-courzandseweg-67/']

#df = pd.DataFrame()

dl = []# Storage for data
dt = []# Storage for column names

for url in urls:
    headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",}
    soup = BeautifulSoup(requests.get(url, headers=headers).text, "html.parser")

    dl_data = soup.find_all("dd") # Scraping the data
    for dlitem in dl_data:
        dl.append(dlitem.text.strip())

    dt_data = soup.find_all("dt") # Scraping the column names
    for dtitem in dt_data:
        dt.append(dtitem.text.strip())


df = pd.DataFrame(dl) # Creating the dataframe

df = df.T # Transposing it because otherwise it is 1D
df.columns = dt # Giving the column names to the dataframe

看起来 dldt 的元素数量不同(分别为 75 和 71)。因此,您不能使用 dt 作为列名。您可以通过添加填充(例如用零初始化 dt 列表)或删除 dl 列表中不必要的元素来解决这个问题。

避免使用多个列表,只需选择一种更精简的方法来处理您的数据并以更结构化的方式保存,例如dict - 这些 dict comprehension 选择 <dt> 之后的所有 <dd> 创建 dict 并将其附加到 data。只需从这个字典列表中创建一个 DataFrame

data.append({e.find_previous_sibling('dt').text.strip(): e.text.strip() for e in soup.select('dt + dd')})

例子

import pandas as pd
import requests
from bs4 import BeautifulSoup

urls = ['https://www.funda.nl/en/koop/ridderkerk/huis-42649106-natalstraat-15/', 'https://www.funda.nl/en/en/koop/rotterdam/huis-42648673-courzandseweg-67/']
data = []

for url in urls:
    headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",}
    soup = BeautifulSoup(requests.get(url, headers=headers).text, "html.parser")

    data.append({e.find_previous_sibling('dt').text.strip(): e.text.strip() for e in soup.select('dt + dd')})

pd.DataFrame(data)