Python 使用BeautifulSoup从CSV中列出的多个URL中刮取信息,然后将这些结果导出到新的CSV文件
我有一个45k+行的CSV文件,每个文件都包含同一个域的不同路径-结构上彼此相同-并且每个文件都可以单击。我设法使用BeautifulSoup来刮取每个文件的标题和内容,并通过Python 使用BeautifulSoup从CSV中列出的多个URL中刮取信息,然后将这些结果导出到新的CSV文件,python,csv,web-scraping,beautifulsoup,Python,Csv,Web Scraping,Beautifulsoup,我有一个45k+行的CSV文件,每个文件都包含同一个域的不同路径-结构上彼此相同-并且每个文件都可以单击。我设法使用BeautifulSoup来刮取每个文件的标题和内容,并通过打印功能验证刮取器。然而,当我试图将收集到的信息导出到一个新的CSV文件时,我只得到最后一个URL的街道名称和描述,而不是我所期望的全部 from bs4 import BeautifulSoup import requests import csv with open('URLs.csv') as csvfile:
打印
功能验证刮取器。然而,当我试图将收集到的信息导出到一个新的CSV文件时,我只得到最后一个URL的街道名称和描述,而不是我所期望的全部
from bs4 import BeautifulSoup
import requests
import csv
with open('URLs.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
site = requests.get(row['addresses']).text
soup = BeautifulSoup(site, 'lxml')
StreetName = soup.find('div', class_='hist-title').text
Description = soup.find('div', class_='hist-content').text
with open('OutputList.csv','w', newline='') as output:
Header = ['StreetName', 'Description']
writer = csv.DictWriter(output, fieldnames=Header)
writer.writeheader()
writer.writerow({'StreetName' : StreetName, 'Description' : Description})
输出CSV如何在输入CSV文件中的每一行上显示相应URL行的街道名称和描述?您需要在同一级别上打开这两个文件,然后在每次迭代中读取和写入。大概是这样的:
从bs4导入美化组
导入请求
导入csv
将open('url.csv')作为a,将open('OutputList.csv','w')作为b:
读卡器=csv。读卡器(a)
writer=csv.writer(b,quoting=csv.QUOTE_ALL)
writer.writerow(['StreetName','Description']))
#假设url是CSV中的第一个字段
对于url,读卡器中的*u:
r=请求。获取(url)
如果r.ok:
soup=BeautifulSoup(r.text'lxml')
street\u name=soup.find('div',class='hist-title').text.strip()
description=soup.find('div',class='hist-content').text.strip()
writer.writerow([街道名称,描述])
我希望这能有所帮助。您没有将刮取的数据保存到任何地方。。。?此外,变量名和函数名应遵循带有下划线的
小写形式。在浏览时,将街道名和描述写入字符串或列表。您只看到最后一个的原因是每次都覆盖了前一个。@guicalmeida,您能发布一个输入CSV文件的示例吗?我可以通过了解你的答案来改进我的答案。非常感谢你,阿克迪亚斯。我在帖子中添加了一个打印屏幕。我设法导出了CSV,但是我遇到了两个小问题:第一,文本的分号被解释为同一行的新列;第二个是,输出CSV在一行上有标题,下面有描述,而不是两列。抱歉,如果这听起来很明显,这是我第一次编码。当做别担心,@guicalmeida。让我看看能不能修好它。如果可能的话,请更新显示你用我的代码得到的结果的问题,另外,请不要发布文本图像,而是复制和粘贴文本。请检查新版本,看看这是否解决了其他问题。由于页面文本上嵌入了换行符,说明如下。我为soup
调用添加了strip()
,它将处理字符串开头和结尾的任何换行符,但不会处理文本中嵌入的任何换行符。如果上述解决方案仍然不能产生所需的结果,请告诉我,我将对其进行修改。