Python属性错误。"NoneType对象没有属性finde_all",一个表没有,另一个表没有。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python属性错误。"NoneType对象没有属性finde_all",一个表没有,另一个表没有。相关的知识,希望对你有一定的参考价值。

我正试图从以下网站上搜索MLB数据 https:/www.baseball-reference.comleaguesMLB2019.shtml. 在页面上有几个数据表,特别是我对击球和投球统计感兴趣。我可以成功地从打击表中提取数据并将其放入一个数据框中,但是当我试图从投球表中提取数据时,错误就出现了,尽管格式基本相同。

from bs4 import BeautifulSoup
import pandas as pd
import time
import requests

for year in range(2018, 2020):

   url = "https://www.baseball-reference.com/leagues/MLB/{}.shtml".format(year)
   headers = {'user-agent': "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"}
   page = requests.get(url, headers=headers)
   soup = BeautifulSoup(page.text, 'html.parser')

   batting_table = soup.find("div", attrs={"id": "div_teams_standard_batting"})
   pitching_table = soup.find("div", attrs={"id": "div_teams_standard_pitching"})

我100%确定HTML引用是正确的。batting_table没有问题,但是pitching_table是 "NoneType"。我知道有些问题可能是由于html页面本身的结构造成的,但在这种情况下,这可能吗?

不知道这是否有用,但我在这些函数中使用了这些表,我将我想从每个团队中提取的特定统计信息传递给这些表,然后将其放在一个列表中。这就是我使用 "find_all "和错误出现的地方。

def batting_stats(bstat):
    tables = batting_table.find_all("td", attrs={"data-stat": bstat})

    b_stats = []
    for table in tables:
        b_stat = table.text
        b_stat = float(b_stat)
        b_stats.append(b_stat)

        b_stats = b_stats[:-2] #exclude total and average

    return b_stats


def pitching_stats(pstat):
    tables = pitching_table.find_all("td", attrs={"data-stat": pstat})

    p_stats = []
    for table in tables:
       p_stat = table.text
       p_stat = float(p_stat)
       p_stats.append(p_stat)

    p_stats = p_stats[:-2]

    return p_stats

我希望这不只是我的一个小错别字,我忽略了,这将是非常令人沮丧的。

先谢谢大家的帮助。

EDIT: 感谢Dainius,我找到了一个解决方案!我并没有完全按照他们提供的链接中的建议去做,但它帮助我意识到由于某种原因,投球表在HTML中被注释了,这在检查网页时并不明显,所以我被Dainius的回复搞糊涂了。

检查结果显示

直到我真正打印 "汤 "的时候才意识到,终于明白了他们的意思。在快速搜索如何从HTML中提取注释后,解决方案只是添加两行代码。

comments = soup.find_all(text=lambda text: isinstance(text, Comment))
pitching_html = comments[19]
pitching_table = BeautifulSoup(pitching_html, 'lxml')
答案

因为我可以看到 div_teams_standard_pitching id在注释中。你需要解析源代码的文本来检索你需要的部分。因为你使用了 BeautifulSoup 我想这个解决方案应该会有帮助。

P.S 你需要做另一个选择器来解析数据,因为它将以文本形式出现。

解决办法

以上是关于Python属性错误。"NoneType对象没有属性finde_all",一个表没有,另一个表没有。的主要内容,如果未能解决你的问题,请参考以下文章

将列表转换为DataFrame时如何处理错误“'NoneType'对象没有属性'keys'”

Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'

为啥 pytest 在测试模型创建时会抛出“AttributeError:'NoneType'对象没有属性'_meta'”错误?

python"TypeError: 'NoneType' object is not iterable"错误解析

连接到 SQL 服务器时,Python pymssql 错误“TypeError:'NoneType' 类型的参数不可迭代”

如何在 python 中“测试”NoneType?