Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用BeautifulSoup从CSV中列出的多个URL中刮取信息,然后将这些结果导出到新的CSV文件_Python_Csv_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 使用BeautifulSoup从CSV中列出的多个URL中刮取信息,然后将这些结果导出到新的CSV文件

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:

我有一个45k+行的CSV文件,每个文件都包含同一个域的不同路径-结构上彼此相同-并且每个文件都可以单击。我设法使用BeautifulSoup来刮取每个文件的标题和内容,并通过
打印
功能验证刮取器。然而,当我试图将收集到的信息导出到一个新的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()
,它将处理字符串开头和结尾的任何换行符,但不会处理文本中嵌入的任何换行符。如果上述解决方案仍然不能产生所需的结果,请告诉我,我将对其进行修改。