【问题标题】:Scraping different variables from multiple URLs into one single CSV file using Python使用 Python 将多个 URL 中的不同变量抓取到一个 CSV 文件中
【发布时间】:2018-07-30 23:41:05
【问题描述】:

我试图将多个 URL 中的数据抓取到一个 csv 文件中,这让我抓狂;)

我确实知道这可能是一个常见问题,而且我不是第一个尝试这样做的人,但不知何故,我无法将其他人的解决方案应用于我的代码,因为它们并不是真正的“ soup.find"-像我一样一个接一个地处理多个变量。我的方法可能太基础了。

所以我开始使用 BeautifulSoup 从单个 URL 中获取多个内容(让我们使用 namejobworksfor)并将其导出放入一个 csv 文件,它工作正常:

import urllib.request
import requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
import csv

url = "https://www.someurl.com/person.asp?personId=123456789"

page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, "lxml")

name = soup.find("h1", {"class": "name"}).get_text()
job = soup.find("span", {"itemprop": "jobTitle"}).get_text()
worksfor = soup.find("a", {"itemprop": "worksFor"}).get_text()

with open('output.csv', 'w') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow([name, job, worksfor])

然后我正在查找如何打开保存在文件 (urls.csv) 中的多个 URL 并抓取(此处:打印)例如名称。这将提供三个名称。

with open('urls.csv') as inf:
    urls = (line.strip() for line in inf)
    for url in urls:
        site = urlopen(url)   
        soup = BeautifulSoup(site, "lxml")
        for name in soup.find("h1", {"class": "name"}):
            print(name)

这也很好用,但我很难尝试将这两种方法结合到代码中,以便为我的 urls.csv 中的每个 URL 提供一个包含一行(名称;年龄;适用于)的 csv 文件

非常感谢您的任何建议


@SuperStew:没错,至少没有产生任何错误的方法之一如下:

with open('urls.csv') as inf:
    urls = (line.strip() for line in inf)
    for url in urls:
        site = urlopen(url)   
        soup = BeautifulSoup(site, "lxml")
        for name in soup.find("h1", {"class": "name"}):         
            with open('output.csv', 'w') as csvfile:
                spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
                spamwriter.writerow([name, job, worksfor])

这总是以 CSV 结尾,其中仅包含我列表中最后一个 URL 中的变量,可能会覆盖所有其他变量。

【问题讨论】:

  • 那么到底是什么问题?
  • @Stew 我已经编辑了我的问题以更好地反映这一点!

标签: python csv url beautifulsoup screen-scraping


【解决方案1】:

好吧,这看起来不错,除了您将结果写入 csv 的最后一部分。您基本上为每个 url 重写了 csv,这意味着当您的代码完成时,只保留最后一个。为避免这种情况,您可以在append 模式下打开您的csv 文件,而不是write。一个小小的改变

with open('output.csv', 'a') as csvfile:

【讨论】:

  • 谢谢!你能告诉我如何包含介绍中提到的其他“soup.find”(我试图抓取的第二个和第三个变量)。现在我得到的看起来像这样: row1: name1 job1 worksfor1; row2: name2 job1 worksfor1; row3: name3 job1 worksfor1
  • 有没有类似:for name in soup.find("h1", {"class": "name"}) and job in soup.find("span", {"itemprop": "jobTitle"})
  • @Stphn,我不知道为什么您在第二种方法中循环 soup.find(...) 而您不在第一种方法中。只需复制 3 行 name、job、worksfor 来代替 for 循环。你不需要那个循环
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2019-05-11
  • 2022-01-06
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多