【问题标题】:Beautiful Soup - scraping empty values美丽的汤 - 刮空值
【发布时间】:2018-12-29 18:31:36
【问题描述】:

我有一些 Python 代码可以将给定赛季的 NBA 球员的比赛日志(例如:the data here)刮到一个csv 文件中。我正在使用美丽的汤。我知道有一个选项可以通过单击网站上的链接来获取csv 版本,但是我在每一行都添加了一些内容,所以我觉得逐行抓取是最简单的选择。我们的目标是最终为每个球员的每个赛季编写代码。

代码如下所示:

import urllib
from bs4 import BeautifulSoup

def getData(url):
    html = urllib.urlopen(url)
    soup = BeautifulSoup(html, "html.parser")
    type(soup)

    file = open('/Users/Mika/Desktop/a_players.csv', 'a')
    for table in soup.find_all("pre", class_ = ""):
        dataline = table.getText
        player_id = player_season_url[47:-14]
        file.write(player_id + ',' + dataline + '\n')
    file.close()

player_season_url = "https://www.basketball-reference.com/players/a/abdelal01/gamelog/1991/"
getData(player_season_url)

问题是这样的:从检查 URL 的元素可以看出,表格中的某些单元格具有空值。

<td class="right " data-stat="fg3_pct"></td>

(这是一个很好的单元格示例,其中的值(“1”)被正确抓取):

<th scope="row" class="right " data-stat="ranker" csk="1">1</th>

抓取时,行不均匀,跳过空值以创建一个值不合适的csv 文件。有没有办法确保在csv 文件中将这些空值替换为" "

【问题讨论】:

  • 您应该在您的问题中添加几行 html 以使您的 minimal reproducible example 完整 - 将其格式化为代码。示例 html 应该包含 good 单元格和单元格。
  • 如果通过链接下载后无法添加到csv?

标签: python web-scraping beautifulsoup


【解决方案1】:

对于编写 csv 文件,Python 具有内置支持(模块 csv)。要从页面中获取整个表格,您可以使用如下脚本:

import requests
from bs4 import BeautifulSoup
import csv
import re

def getData(url):
    soup = BeautifulSoup(requests.get(url).text, 'lxml')

    player_id = re.findall(r'(?:/[^/]/)(.*?)(?:/gamelog)', url)[0]

    with open('%s.csv' % player_id, 'w') as f:
        csvwriter = csv.writer(f, delimiter=',', quotechar='"')
        d = [[td.text for td in tr.find_all('td')] for tr in soup.find('div', id='all_pgl_basic').find_all('tr') if tr.find_all('td')]
        for row in d:
            csvwriter.writerow([player_id] + row)

player_season_url = "https://www.basketball-reference.com/players/a/abdelal01/gamelog/1991/"
getData(player_season_url)

输出为 CSV 文件(我从 LibreOffice 添加):

编辑:

  • 从 URL 中提取 player_id
  • 文件保存在 {player_id}.csv

【讨论】:

  • 这可行,但它不会像我在原始代码中那样将 player_id 添加到每一行
  • 我在第 11 行遇到无效语法错误,line 11 with open(f'{player_id}.csv', 'w') as f: SyntaxError: invalid syntax [Finished in 0.1s with exit code 1]
  • 我有 2.7。我收到另一个错误:line 18, in &lt;module&gt; getData(player_season_url) File "/Users/Mika/Desktop/ex.py", line 9, in getData player_id = re.search(r'(?:/[^/]/)(.*?)(?:/gamelog)', url)[1] TypeError: '_sre.SRE_Match' object has no attribute '__getitem__'
猜你喜欢
  • 2021-01-15
  • 2020-12-13
  • 2019-03-13
  • 2014-05-28
  • 2020-09-28
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多