Beautifulsoup:从A到Z遍历列表并解析数据以存储到数据框中

0 投票
2 回答
54 浏览
提问于 2025-04-13 13:23

我现在正在做一个非常简单的解析器,目的是从一个成员列表中提取信息。我们这里有一个成员列表:

请查看:https://vvonet.vvo.at/vvonet_mitgliederverzeichnisneu

注意:我们需要打开“kontaktinformationen”这个链接,并把那里的数据抓取到一个pandas的数据框中。

我觉得我可以用Python的BeautifulSoup和requests库来做到这一点,然后把结果打印出来或者存储到数据框中。

首先,脚本应该获取成员列表页面,提取每个成员页面的链接,访问每个成员的“kontaktinformationen”页面,然后提取联系信息。最后,我觉得把联系信息存储在一个数据框中是最好的。最终,我应该能够把这个数据框打印到屏幕上或者保存为CSV文件。

这是我的尝试:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# first,  we send a GET request to the member list page
url = "https://vvonet.vvo.at/vvonet_mitgliederverzeichnisneu"
response = requests.get(url)

# here a check if the request was successful
if response.status_code == 200:
    # Parse the HTML content of the page
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Find now all member links
    member_links = soup.find_all("a", class_="font1")
    
    # now - Initialize lists to store data
    member_data = []
    
    # Iterate over member links
    for member_link in member_links:
        # Get the URL of the "kontaktinformationen" page
        member_url = "https://vvonet.vvo.at" + member_link["href"] + "/kontaktinformationen"
        
        # Send a GET request to the member's "kontaktinformationen" page
        member_response = requests.get(member_url)
        
        # Check if the request was successful
        if member_response.status_code == 200:
            # Parse the HTML content of the page
            member_soup = BeautifulSoup(member_response.content, "html.parser")
            
            # Find the contact information section
            contact_info_div = member_soup.find("div", class_="contact")
            
            # Check if contact information section exists
            if contact_info_div:
                # Extract the contact information
                contact_info_text = contact_info_div.get_text(separator="\n", strip=True)
                member_data.append(contact_info_text)
            else:
                member_data.append("Contact information not found")
        else:
            member_data.append(f"Failed to retrieve contact information for {member_link.text.strip()}")
    
    # Create a DataFrame
    df = pd.DataFrame(member_data, columns=["Contact Information"])
    
    # Display the DataFrame
    print(df)
    
    # Alternatively, you can save the DataFrame to a CSV file
    # df.to_csv("member_contact_information.csv", index=False)
else:
    print("Failed to retrieve the member list page.")

但是目前我得到的是一个空的数据框……

Empty DataFrame
Columns: [Contact Information]
Index: []

2 个回答

1

一开始减少复杂步骤其实很简单。
把你想访问的网址直接写死在代码里。
先测试一下你发出的请求能得到什么结果。
完成这个后,评估一下你的请求,使用Beautiful Soup这个库来检查一些常见的特定字段。
再检查一下结果。
最后把这些结果放到pandas的数据框里。

不要在一步操作中做三件事(这可能会出错得很离谱)。

2

你在页面上看到的数据是从不同的网址加载的,格式是XML:

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = "https://vvonet.vvo.at/vvo/vvonet_website.nsf/allMitglieder?ReadViewEntries="

soup = BeautifulSoup(requests.get(url).content, "xml")

data = []
for e in soup.select("viewentry"):
    t = {}
    for d in e.select("entrydata"):
        t[d["name"]] = d.get_text(strip=True, separator=" ")
    data.append(t)

df = pd.DataFrame(data)
print(df)

输出结果是:

                                                                                                             docTitle                           globUNID     docBundesland                                                                             docFachbereich                                               docFax                                        docInternet                                                 docMail                                docOrt                                                          docStrasse                                           docTelefon                                                                                               docUnternehmen
0                                                                                             Acredia Versicherung AG  x095DA0F5F9E395B0C1258A4A0037FD66              Wien                                                                         Schadenversicherer                                                                                   http://www.acredia.at                                       office@acredia.at                             1010 Wien                                                 Himmelpfortgasse 29                                     +43/(0)5 01 02-0                                                                                      Acredia Versicherung AG
1                                                                          AIG Europe S.A. - Direktion für Österreich  xFB78910F9D0D7FC7C1258A4A0037FCED              Wien                                                                                                                              +43/1/533 25 00-80                               http://www.aig.co.at                                info.oesterreich@aig.com                             1010 Wien                                                   Herrengasse 1 - 3                                      +43/1/533 25 00                                                                    AIG Europe S.A.\nDirektion für Österreich
2                                                                                                        Allianz Care  x7B60F7881DF6129AC1258A4A0037FD61                                                                                   Außerordentliches Mitglied                                                                             http://www.allianz-care.com                                                                                 IRL-Dublin 12                                    15 Joyce Way, Park West Business                                     +44/7825/510 814                                                                                                 Allianz Care
3                                                                                                  Allianz Commercial  xA362FDC72B76421DC1258A4A0037FD43              Wien                                                                                                                             +43/(0)59009-402 14                  http://www.commercial.allianz.com                               stefanie.thiem@allianz.at                             1100 Wien                                                 Wiedner Gürtel 9-13                                   +43/(0)59009-88700                                                                                           Allianz Commercial
4                                                            Allianz Elementar Lebensversicherungs-Aktiengesellschaft  xD41EC8AF73F7ED93C1258A4A0037FCE5              Wien                                                                                                                             +43/(0)5 9009-70700                              http://www.allianz.at                 feedback@allianz.at, schaden@allianz.at                             1100 Wien                                                 Wiedner Gürtel 9-13                                      +43/(0)5 9009-0                                                     Allianz Elementar Lebensversicherungs-Aktiengesellschaft
5                                                                  Allianz Elementar Versicherungs-Aktiengesellschaft  x95C137D749F4EB97C1258A4A0037FCE6              Wien                    Kfz-Versicherer Krankenversicherer Schadenversicherer Unfallversicherer                                  +43/(0)5 9009-70000                              http://www.allianz.at                 feedback@allianz.at, schaden@allianz.at                             1100 Wien                                                 Wiedner Gürtel 9-13                                      +43/(0)5 9009-0                                                           Allianz Elementar Versicherungs-Aktiengesellschaft
6                                                                                                 APK Versicherung AG  x7C2E8BD3E6C46C0BC1258A4A0037FD34              Wien                                                                          Lebensversicherer                                   +43/(0)50 275-3709                     http://www.apk-versicherung.at                                     versicherung@apk.at                             1030 Wien                                             Thomas-Klestil-Platz 13                                   +43/(0)50 275-3700                                                                                          APK Versicherung AG
7                                                                                  ARAG SE - Direktion für Österreich  xFA932E61C5D638E3C1258A4A0037FD41              Wien                                                                                                                               +43/1/531 02-1923                                 http://www.arag.at                                            info@arag.at                             1041 Wien                                    Favoritenstraße 36, Postfach 182                                       +43/1/531 02-0                                                                           ARAG SE \nDirektion für Österreich
8        Atradius Kreditversicherung - Zweigniederlassung der Atradius Crédito y Caución S.A. de Seguros y Reaseguros  xAA2CB3183BE03937C1258A4A0037FD4B              Wien                                                                                                                                                                             http://www.atradius.at                        versicherung.kredit@atradius.com                             1220 Wien                              Vienna DC Tower 1, Donau-City-Straße 7                                       +43/1/813 0313  Atradius Kreditversicherung\nZweigniederlassung der Atradius Crédito y Caución S.A. de Seguros y Reaseguros
9                                                                                       Atzbacher Versicherung V.a.G.  xF489570D29A92438C1258A4A0037FD68    Oberösterreich                                                                    Sachversicherungsverein                                    +43/7673/75488-20               http://www.atzbacher-versicherung.at                          info@atzbacher-versicherung.at      4690 Oberndorf bei Schwanenstadt                                                 Atzbacher Straße 23                                     +43/7673/75488-0                                                                                Atzbacher Versicherung V.a.G.
10                                                                         AWP P&C S.A., Niederlassung für Österreich  x3173A1D948F040D7C1258A4A0037FCEA              Wien                                                                          Unfallversicherer                                                                         http://www.allianz-partners.com                                  service.at@allianz.com                             1130 Wien                                              Hietzinger Kai 101-105                   +43/1/525 03-6945 (Service Center)                                                AWP P&C S.A., Niederlassung für Österreich (Allianz Partners)

...

撰写回答