Beautifulsoup:从A到Z遍历列表并解析数据以存储到数据框中
我现在正在做一个非常简单的解析器,目的是从一个成员列表中提取信息。我们这里有一个成员列表:
请查看: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)
...