【发布时间】:2018-12-11 08:20:39
【问题描述】:
我正在制作一个网络抓取工具,用于从某个网站抓取 MLB 游戏的得分。我基本上是在尝试在我的输出 CSV 文件中创建一个标题行,它由“团队”和网站上的一个 div 类组成,其中包含游戏中的每个局数,然后是 R、H、E。通常,一个可以只是 .writerow['Teams', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'R', ' H', 'E'] 进行该行,但是有时比赛会进入额外的一局,因此带有局数/ RHE 的 div 类会动态变化,因此我希望刮板能够识别这一点并相应地调整行。
我的代码如下所示:
from bs4 import BeautifulSoup
import requests
import csv
with open('BoxScoreURLS.csv', newline='') as f_urls, open('IndividualBoxScoresOutput.csv', 'w', newline='') as f_output:
csv_urls = csv.reader(f_urls)
csv_output = csv.writer(f_output)
#csv_output.writerow(['Teams', 'Box Scores'])
for line in csv_urls:
page = requests.get(line[0]).text
soup = BeautifulSoup(page, 'html.parser')
topline = soup.findAll('div', {'class' :'LineScoreCard__lineScoreColumnElement--1byQk LineScoreCard__header--3ZO_N'})
for t in range(len(topline)):
csv_output.writerow(['Teams', topline[t].text])
这是我要抓取的 URL:(我的代码将从单独的 CSV 中的 URL 列表中读取)
https://www.thescore.com/mlb/events/63853
这是它输出到 CSV 的内容:
Teams 1
Teams 2
Teams 3
Teams 4
Teams 5
Teams 6
Teams 7
Teams 8
Teams 9
Teams R
Teams H
Teams E
当有一场比赛进行加时赛时,它看起来像:
Teams 1
Teams 2
Teams 3
Teams 4
Teams 5
Teams 6
Teams 7
Teams 8
Teams 9
Teams 10
Teams 11
Teams R
Teams H
Teams E
这是我希望看到的:
Teams 1 2 3 4 5 6 7 8 9 R H E
因此,该 div 类的“查找全部”将正确收集信息,但现在创建的是 CSV 中的两列。我也尝试了几种不同的 row.append 组合,但没有成功。一旦我可以找到将 div 类附加到与“团队”显示位置相同的行的解决方案,我将在标题行中将分数放在下面。
是否有可能以某种方式循环查找所有 div 类,然后将其附加到与“Teams”相同的行中水平显示?让我知道我是否可以回答更多问题。
谢谢!
【问题讨论】:
-
writerow([topline[t].txt for t in range(len(topline))])呢? -
您能否提供示例数据,说明它的正常显示方式以及在加时赛中的其他情况。我无法理解提供的信息。
-
使用您提供的代码,我们无法重现问题。你能edit这个问题包含必要的信息以允许我们运行它吗?
-
@SergeBallesta 感谢您的建议,但是当我尝试它时,它实际上并没有输出任何东西,但我认为这会奏效!?
-
@hsnsd 当然,我会提出另一个答案,提供更多信息。更正:我将更新我最初的问题以提供信息。
标签: python python-3.x csv beautifulsoup