BeautifulSoup - 将抓取的数据保存到行和列中

BeautifulSoup - Saving scraped data in to rows and columns

我刚刚开始使用 Python 进行网络抓取,而且我正在慢慢取得进展。我希望有人能帮助我。

我正在尝试删除冰岛飞机登记册上的所有飞机。我写了一个脚本,从 table 中提取所有数据并将其打印到屏幕上,如下所示:

from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://www.icetra.is/aviation/aircraft/register/"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')

aircraft = soup.findAll('tr')

for ac in aircraft:
    print(ac.get_text())

我想做的是将它保存到一个包含行和列的 csv 文件中,我的猜测是我需要将每一列作为一个变量并将每一行数据读入相关专栏。

此致, 马克

您可以使用 pandas 中的 DataFrame.to_csv()。这是一个例子:

from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://www.icetra.is/aviation/aircraft/register/"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')

aircraft = soup.findAll('tr')

aircrafts = [ac.get_text() for ac in aircraft]
df = pd.DataFrame({"Aircrafts": aircrafts})
df.to_csv("aircrafts.csv")

编辑: 我注意到 soup.findAll('tr') 可能会获得您想要的更多信息,在本例中它是从整行中获取文本。您可能希望使用 ac.stripped_strings (documentation) 从列中获取每个字符串。

编辑 2: 您应该尝试 pd.read_html() 阅读这篇 table。但是,我尝试修复我最后的代码并得到了这个解决方案:

from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://www.icetra.is/aviation/aircraft/register/"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')

aircraft = soup.findAll('tr')
rows = [list(ac.stripped_strings) for ac in aircraft]

df = pd.DataFrame.from_records(rows)
df.columns = df.iloc[0]
df.drop(index=0, inplace=True)
df.to_csv("aircrafts.csv", index=False)