Python属性错误:一个表的“非类型对象没有属性find_all”,而另一个表没有

2024-05-31 23:48:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从https://www.baseball-reference.com/leagues/MLB/2019.shtml中提取MLB数据。页面上有几个数据表,特别是我对击球和投球统计数据感兴趣。我可以成功地从击球表中提取数据并将其放入数据帧中,但当我尝试从投球表中提取数据时会出现错误,即使格式基本相同:

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引用是正确的。击球台很好,但投球台是“非类型”。我知道有些问题可能是由于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

我希望这不仅仅是我忽略的一个小的打字错误,这将是非常令人沮丧的

提前感谢大家的帮助

编辑:多亏了Dainius,我才找到了解决方案!我并没有完全按照他们提供的链接中的建议去做,但这让我意识到,出于某种原因,投球表是用HTML注释的,这在查看网页时并不明显,所以我被Dainius的回复弄糊涂了

What Inspect shows

直到我把“汤”印出来,终于明白了它们的意思,我才意识到这一点。在快速搜索如何从HTML中提取注释后,解决方案只是添加了两行代码:

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

Tags: 数据textimportdivhtmlstatstableall
1条回答
网友
1楼 · 发布于 2024-05-31 23:48:22

正如我所看到的,div_teams_standard_pitchingid在注释中。您需要解析源代码的文本以检索所需的部分。因为您使用了BeautifulSoup,我认为这个解决方案应该会有所帮助

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

Solution

相关问题 更多 >