【问题标题】:Scrape information from multiple URLs listed in a CSV using BeautifulSoup and then export these results to a new CSV file使用 BeautifulSoup 从 CSV 中列出的多个 URL 中抓取信息,然后将这些结果导出到新的 CSV 文件
【发布时间】:2020-02-20 00:02:32
【问题描述】:

我有一个 45k+ 行的 CSV 文件,每一个都包含同一个域的不同路径——它们在结构上彼此相同——而且每一个都是可点击的。我设法使用 BeautifulSoup 来抓取每个标题和内容,并通过print 函数,我能够验证抓取器。但是,当我尝试将收集到的信息导出到新的 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 行的街道名称和描述?

【问题讨论】:

  • 你没有保存你在任何地方抓取的数据......?此外,变量和函数名称应遵循lower_case_with_underscores 样式。
  • 在您浏览时将 StreetName 和 Description 写入字符串或列表。您只看到最后一个的原因是您每次都覆盖前一个。
  • @guicalmeida,您可以发布您的输入 CSV 文件的示例吗?通过了解您的回答,我可以稍微改进一下答案。

标签: python csv web-scraping beautifulsoup


【解决方案1】:

您需要在同一级别打开这两个文件,然后在每次迭代时进行读写。像这样的:

from bs4 import BeautifulSoup
import requests
import csv

with open('URLs.csv') as a, open('OutputList.csv', 'w') as b:

    reader = csv.reader(a)

    writer = csv.writer(b, quoting=csv.QUOTE_ALL)
    writer.writerow(['StreetName', 'Description'])

    # Assuming url is the first field in the CSV
    for url, *_ in reader:
        r = requests.get(url)
        if r.ok:
            soup = BeautifulSoup(r.text, 'lxml')
            street_name = soup.find('div', class_='hist-title').text.strip()
            description = soup.find('div', class_='hist-content').text.strip()
            writer.writerow([street_name, description])

希望对你有帮助。

【讨论】:

  • 非常感谢,accdias。我在帖子中添加了一个打印屏幕。我设法导出了 CSV,但遇到了 2 个小问题:首先,文本的分号被解释为同一行的新列;第二个是输出 CSV 在一行上有标题和下面的描述,而不是两列。抱歉,如果这一切听起来很明显,这实际上是我第一次编码。问候!
  • 不用担心,@guicalmeida。让我看看我能不能解决它。如果可能的话,请更新显示您使用我的代码获得的结果的问题,并且请不要发布文本图像,而是复制并粘贴文本。
  • 请检查新版本,看看是否解决了其他问题。由于页面文本中嵌入了换行符,因此描述如下。我为soup 调用添加了strip(),它会处理字符串开头和结尾的任何换行符,但不会处理文本中嵌入的任何换行符。如果上面的解决方案仍然没有产生想要的结果,请告诉我,我会修改它。
猜你喜欢
  • 2022-01-06
  • 2019-11-11
  • 2014-09-10
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2017-06-18
  • 2018-04-15
相关资源
最近更新 更多