【问题标题】:Separate Python web scraped data in different columns (Excel)在不同的列中分离 Python Web 抓取的数据 (Excel)
【发布时间】:2018-07-18 16:14:42
【问题描述】:

尊敬的 Stackoverflow 社区,

最近我开始玩 Python。通过观看 YouTube 视频和浏览这个平台,我学到了很多东西。但我无法解决我的问题。

希望你们能帮帮我。

所以我尝试使用 Python(Anaconda) 从网站上抓取信息。并将这些信息放在一个 CSV 文件中。我试图通过在我的脚本中添加“,”来分隔列。但是当我打开我的 CSV 文件时,所有数据都放在 1 列(A)中。相反,我希望将数据分隔在不同的列中(A 和 B(以及 C、D、E、F 等,当我想添加信息时))。

我必须在这段代码中添加什么:

filename = "brands.csv"
f = open(filename, "w")

headers = "brand, shipping\n"

f.write(headers)

for container in containers:
    brand_container = container.findAll("h2",{"class":"product-name"})
    brand = brand_container[0].a.text

    shipping_container = container.findAll("p",{"class":"availability in-stock"})
    shipping = shipping_container[0].text.strip()

    print("brand: " + brand)
    print("shipping: " + shipping)

    f.write(brand + "," + shipping +  "," + "\n")

f.close()

感谢您的帮助!

亲切的问候,


根据Game0ver的建议完成脚本:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.scraped-website.com'

# opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")   

# grabs each product
containers = page_soup.findAll("li",{"class":"item last"})
container = containers[0]

import csv

filename = "brands.csv"
with open(filename, 'w') as csvfile:
    fieldnames = ['brand', 'shipping']
    # define your delimiter
    writer = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames)
    writer.writeheader()

for container in containers:
    brand_container = container.findAll("h2",{"class":"product-name"})
    brand = brand_container[0].a.text

    shipping_container = container.findAll("p",{"class":"availability in-stock"})
    shipping = shipping_container[0].text.strip()

    print("brand: " + brand)
    print("shipping: " + shipping)

正如我提到的,这段代码不起作用。我一定是做错了什么?

【问题讨论】:

    标签: python excel web-scraping multiple-columns export-to-csv


    【解决方案1】:

    您最好使用python's csv module 来做到这一点:

    import csv
    
    filename = "brands.csv"
    with open(filename, 'w') as csvfile:
        fieldnames = ['brand', 'shipping']
        # define your delimiter
        writer = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames)
        writer.writeheader()
        # write rows...
    

    【讨论】:

    • 感谢您的回复。我尝试使用此解决方案,但结果 CSV 文件仅在第一列中显示“品牌,运输”。我什至没有在其他行中取回我的信息。但也许我在编码中犯了错误。这是应该的样子吗:
    • ... = containers[0] import csv filename = "brands.csv" with open(filename, 'w') as csvfile: fieldnames = ['brand', 'shipping'] #define您的分隔符 writer = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames) writer.writeheader() 用于容器中的容器:brand_container = container.findAll("h2",{"class":"product-name" }) 品牌 = brand_container[0].a.text shipping_container = container.findAll("p",{"class":"库存中的可用性"}) shipping = shipping_container[0].text.strip() print("品牌:" + 品牌) print("运费:" + 运费)
    • 您必须使用writerow 方法将行写入您的csv。此外,如果您有任何问题,最好用您当前的代码更新您的问题,以便我更容易测试它。
    • 我已经完成了编辑好的脚本。我一定是做错了什么?
    • 是的,您实际上从未将行写入 csv。对于每一行,您需要使用writer.writerow(your_row_here),这就是您的 csv 为空的原因。
    【解决方案2】:

    尝试用双引号将您的值括起来,例如

    f.write('"'+brand + '","' + shipping +  '"\n')
    

    虽然,有更多更好的方法来处理这个通用任务和这个功能。

    【讨论】:

    • 我删除了我的行 (f.write(brand + "," + shipping + "," + "\n")) 并用您的行替换。不幸的是,它没有用。它只添加了几个引号作为文本,而不是 1 个逗号。
    【解决方案3】:

    您可以选择我在下面显示的任何一种方式。由于您的脚本中可用的 url 无法访问,因此我提供了一个有效的。

    import csv
    import requests
    from bs4 import BeautifulSoup
    
    url = "https://yts.am/browse-movies"
    
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'lxml')
    
    with open("movieinfo.csv", 'w', newline="") as f:
        writer = csv.DictWriter(f, ['name', 'year'])
        writer.writeheader()
    
        for row in soup.select(".browse-movie-bottom"):
            d = {}
            d['name'] = row.select_one(".browse-movie-title").text
            d['year'] = row.select_one(".browse-movie-year").text
            writer.writerow(d)
    

    或者你可以尝试如下:

    soup = BeautifulSoup(response.content, 'lxml')
    
    with open("movieinfo.csv", 'w', newline="") as f:
        writer = csv.writer(f)
        writer.writerow(['name','year'])
    
        for row in soup.select(".browse-movie-bottom"):
            name = row.select_one(".browse-movie-title").text
            year = row.select_one(".browse-movie-year").text
            writer.writerow([name,year])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 2019-07-09
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多