【问题标题】:Scrape html into csv file将 html 抓取到 csv 文件中
【发布时间】:2016-05-24 21:55:54
【问题描述】:

下面的代码从以下页面抓取数据: "http://www.gbgb.org.uk/resultsMeeting.aspx?id=136005.

它会抓取所有相关字段并将它们打印到屏幕上。但是我想尝试将表格形式的数据打印到 csv 文件中,以导出到电子表格或数据库中。

在网站源 HTML 中,赛道、日期、日期时间(比赛时间)等级、距离和奖品来自 div 类“resultsBlockheader”,并在网页上形成比赛卡的顶部区域。

源 HTML 中的比赛正文来自 div 类“resultsBlock”,其中包括完成位置(Fin)灰狗、陷阱、SP、时间/秒和时间距离。

最终会是这个样子

track,date,datetime,grade,distance,prize,fin,greyhound,trap,SP,timeSec,time distance

这可能吗,或者我必须先将其以表格形式打印到屏幕上,然后才能将其导出为 csv。

 from urllib import urlopen
 from bs4 import BeautifulSoup

 html = urlopen("http://www.gbgb.org.uk/resultsMeeting.aspx?id=136005")
 bsObj = BeautifulSoup(html, 'lxml')

 nameList = bsObj. findAll("div", {"class": "track"})
 for name in nameList:
 List = bsObj. findAll("div", {"class": "distance"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("div", {"class": "prizes"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "first essential fin"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "essential greyhound"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "trap"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "sp"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "timeSec"})
 for name in nameList:
     print(name. get_text())
 nameList = bsObj. findAll("li", {"class": "timeDistance"})
 for name in nameList:
     print(name. get_text())

 nameList = bsObj. findAll("li", {"class": "essential trainer"})
 for name in nameList:
     print(name. get_text())

 nameList = bsObj. findAll("li", {"class": "first essential comment"})
 for name in nameList:
     print(name. get_text())

 nameList = bsObj. findAll("div", {"class": "resultsBlockFooter"})
 for name in nameList:
     print(name. get_text())

 nameList = bsObj. findAll("li", {"class": "first essential"})
 for name in nameList:
     print(name. get_text())

【问题讨论】:

  • 这只是在自己的行上打印一大堆东西。如果您想要表格或 csv 格式,则需要重新格式化整个代码
  • 嗨 cricket_007。感谢您的回复。我怎样才能让屏幕上的东西并排打印(对所有这些来说仍然很新):)
  • print(1,2) 将打印在同一行。 print(1) 然后print(2) 将打印在新行上。就这么简单。您必须将每个值放在一个列表中才能将它们打印在一行上。目前,您专注于列而不是行。
  • 嗨 cricket_007,再次感谢您的回复,我尝试了 nameList = bsObj。 findAll("div", {"class": "track,grade,distance"}) 但我什么也没做对吗?亲切的问候 Moonsgadow
  • 只有当有一个类为 "track,grade,distance" 的 div 时才正确。旁注:用漂亮的汤获得多个课程并不是那么简单(这个网站上有几个问题如何做到这一点)

标签: python html csv web-scraping beautifulsoup


【解决方案1】:

不知道您为什么没有按照this answer 中建议的代码解决您之前的问题 - 它实际上解决了将字段分组在一起的问题。

这是将trackdategreyhound 转储到csv 中的后续代码:

import csv

from bs4 import BeautifulSoup
import requests


html = requests.get("http://www.gbgb.org.uk/resultsMeeting.aspx?id=135754").text
soup = BeautifulSoup(html, 'lxml')

rows = []
for header in soup.find_all("div", class_="resultsBlockHeader"):
    track = header.find("div", class_="track").get_text(strip=True).encode('ascii', 'ignore').strip("|")
    date = header.find("div", class_="date").get_text(strip=True).encode('ascii', 'ignore').strip("|")

    results = header.find_next_sibling("div", class_="resultsBlock").find_all("ul", class_="line1")
    for result in results:
        greyhound = result.find("li", class_="greyhound").get_text(strip=True)

        rows.append({
            "track": track,
            "date": date,
            "greyhound": greyhound
        })


with open("results.csv", "w") as f:
    writer = csv.DictWriter(f, ["track", "date", "greyhound"])

    for row in rows:
        writer.writerow(row)

运行代码后results.csv的内容:

Sheffield,02/02/16,Miss Eastwood
Sheffield,02/02/16,Sapphire Man
Sheffield,02/02/16,Swift Millican
...
Sheffield,02/02/16,Geelo Storm
Sheffield,02/02/16,Reflected Light
Sheffield,02/02/16,Boozed Flame

请注意,我在这里使用的是requests,但如果您愿意,可以使用urllib2

【讨论】:

  • 嗯。刚刚注意到 OP 对这一个问题有多少问题
  • 嗨,alecxe。非常感谢您提供的代码。我已经列出了所有字段,但无法获得“培训师”“cmets”和“第一重要”字段。欢迎提出任何建议 :)
  • @moonshadow 当然,让我们避免解决 cmets 中的后续问题。如果您在提取所有字段时遇到困难,请查看创建一个单独的问题是否有意义。谢谢。
  • 嗨,Alecxe,谢谢你,我会弄乱代码,看看是否能解决问题,但如果不能,我会提出一个新问题。再次感谢 Moonshadow
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2021-10-04
  • 2018-06-06
  • 1970-01-01
  • 2018-12-05
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多