代码之家  ›  专栏  ›  技术社区  ›  Stphn

使用Python将多个URL中的不同变量刮到一个CSV文件中

  •  1
  • Stphn  · 技术社区  · 7 年前

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

    我确实知道这可能是一个常见的问题,我不是第一个尝试这样做的人,但不知何故,我无法将其他人的解决方案应用到我的代码中,因为他们并不像我那样一个接一个地“汤。查找”多个变量。我的方法可能太基本了。

    所以我开始抓取多个东西(让我们一起 名称 , 工作 工作对象 )使用BeautifulSoup从单个URL将其导出到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])
    

    然后,我在查找如何打开保存在文件中的多个URL(URL.csv)和抓取(此处:打印)例如名称。这里有三个名字。

    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)
    

    这也很好,但我很难将这两种方法结合到代码中,以提供一个csv文件,其中URL中的每个URL都有一行(name;age;worksfor)。csv

    非常感谢您的建议


    @Supersew:对,所以至少不会产生任何错误的方法之一是:

    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中的变量,可能会覆盖所有其他变量。

    1 回复  |  直到 7 年前
        1
  •  1
  •   SuperStew    7 年前

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

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