python - Python BeautifulSoup - 抓取多个页面并将结果导出到 CVS
问题描述
我想在不同的页面中抓取一些信息。下面的代码可以帮助我使用 print() 函数抓取信息。
问题是我只从最后一页获取数据。上一页的结果无法写入 CSV 文件。我该怎么办?谢谢。
编码:
enter code here
import requests
from csv import writer
from bs4 import BeautifulSoup
urls = ['https://www.xxxxxxxxxxxxxxx/02-nb.php','https://www.xxxxxxxxxxxxxxx/03-np.php','https://www.xxxxxxxxxxxxxxx/04-nb.php']
for index,url in enumerate(urls):
requests.get(url)
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')
print(soup)
table_data = soup.find('table')
with open("words.csv", "wt",newline='',encoding='utf-8') as csv_file:
csv_data = writer(csv_file, delimiter =',')
for voc in table_data.find_all('tr'):
row_data = voc.find_all('td')
row = [tr.text for tr in row_data]
csv_data.writerow(row)
解决方案
您正在遍历每个 URL,但您编写的将数据写入 CSV 的逻辑不在该for
循环之外,因此它只是将最后一点数据写入文件。我相信你想要的是:
for index,url in enumerate(urls):
requests.get(url)
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')
print(soup)
table_data = soup.find('table')
if index:
mode = "a"
else:
mode = "w"
with open("words.csv", mode, newline='',encoding='utf-8') as csv_file:
csv_data = writer(csv_file, delimiter =',')
for voc in table_data.find_all('tr'):
row_data = voc.find_all('td')
row = [tr.text for tr in row_data]
csv_data.writerow(row)
这将words.csv
在每次迭代中写入urls
,而不是遍历所有urls
并words.csv
在最后一次迭代中写入。
推荐阅读
- azure-devops - 我可以在同一个存储库中混合框架项目和 .net 标准项目吗?dotnet 包命令
- hadoop - 安装Hadoop的一些问题。ERROR: Attempting to operation on hdfs namenode as root ERROR:
- javascript - 如何在javascript中对数字数组进行排序,以确保在添加重复项之前完成第一个计数?
- java - 如何在java中找到数组中的第二大数字
- javascript - 如何通过 JavaScript 插入 HTML 元素?
- fsm - 长比特序列的 FSM
- react-native - 模块解析失败:意外令牌 (11:19)
- android - 如何使用 Retrofit android 从 API 获取实时数据
- laravel - 如何为 beanstalkd 设置队列服务器集群?
- javascript - 使用 jquery 或 javascript 计算表列中的重复值并传递给 rowspan