【问题标题】:Writing scraped data to a csv file将抓取的数据写入 csv 文件
【发布时间】:2021-02-26 15:29:55
【问题描述】:

我正在使用以下代码从工作站点抓取数据并使用 BeautifulSoup 将其写入 csv 文件。我看到抓取代码有效,因为当我打印提取的文件时,它似乎没问题。但是,我无法将抓取的数据打印到 csv 文件中。创建了一个 csv 文件,但在每一列中,只有一些字母,如 a、b、c,而不是描述标题、薪水等的完整单词。有人可以帮我吗?

import requests
import csv
r=requests.get("https://www.reed.co.uk/jobs/accountancy-jobs")
r.content
soup=BeautifulSoup(r.content)
#print(soup.prettify())
soup.find_all("article")
jobs=soup.find_all("article")

for job in jobs:
    title=job.h3.text
    posterline=job.find("div", attrs={"class":"posted-by"})
    poster=posterline.find("a").text
    postdate=job.find('div',{'class': 'posted-by'}).next_element
    description=job.find("div", attrs={"class":"description"})
    metadata=job.find("div", attrs={"class":"metadata"})
    metadata=job.find("div", attrs={"class":"metadata"})
    salary=metadata.find("li", attrs={"class": "salary"}) 
    salary=salary.text
    time=metadata.find("li", attrs={"class": "time"})

    datas=(title, salary, time, postdate, poster)
    with open('reeddata.csv', 'w', newline='') as file:
        writer = csv.writer(file)
        headers = ['Title','Salary','Time', 'Postdate','Poster']
        writer.writerow(headers)
        for data in datas:
            writer.writerow(data)

【问题讨论】:

  • 您能解释一下您在尝试将数据写入 csv 时遇到什么样的问题吗?是文件没有被创建,文件内的数据没有被写入,还是其他?
  • 您好,文件已创建,但每一列中只有一些字母,如 a、b、c,而不是描述标题、薪水等的完整单词。谢谢。

标签: python web-scraping beautifulsoup


【解决方案1】:

尝试下面的脚本来获取所需的内容并将其写入相应的 csv 文件中:

import requests
from bs4 import BeautifulSoup
import csv

r = requests.get("https://www.reed.co.uk/jobs/accountancy-jobs")
soup = BeautifulSoup(r.content,"html.parser")

with open('reeddata.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Title','Salary','Time', 'Postdate','Poster'])
    
    for job in soup.find_all("article"):
        title = job.find("h3",class_="title").find("a",href=True).get_text(strip=True)
        poster = job.find("div", class_="posted-by").find("a").get_text(strip=True)
        postdate = job.find('div',class_='posted-by').next_element.strip() 
        salary = job.find("div",class_="metadata").find("li",class_="salary").get_text(strip=True) 
        time = job.find("div",class_="metadata").find("li",class_="time").get_text(strip=True)
        writer.writerow([title, salary, time, postdate, poster])

【讨论】:

    【解决方案2】:

    这是一个缩进问题,在这里,对于您找到的每份工作,您打开一个 csv,写下该工作的描述并关闭它,然后为下一个工作覆盖 csv。 尝试取消缩进写入循环并将您的值附加到“数据”,而不是为每个作业重新定义它。

    【讨论】:

    • 谢谢。我试图纠正你的建议。在调用 csv 模块时,我未缩进数据和打开并将 'w' 替换为 'a'。我仍然无法让它工作。对不起,我是 Python 初学者。
    • 您可以编辑您的问题以包含您所做的任何更改,以便我们查看更改内容
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2019-07-20
    • 2020-02-22
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多