我无法从bs4对象中找到重新生成的元素

2024-06-08 16:49:22 发布

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

我遇到的问题快把我逼疯了。我正在尝试从职业足球参考网站中提取文本

我需要的信息在网页第二部分显示的td元素中。该信息位于名为qb_hurry的td元素中。以下是我到目前为止的情况:

res = requests.get('https://www.pro-football-reference.com/players/D/DonaAa00.htm')

soup = bs4.BeautifulSoup(res.text, 'html.parser')

我试过了

totalQbHurrys = soup.find('div', {'id':'all_detailed_defense'})

当我解析漂亮的汤对象并打印它时,我可以看到需要提取的信息。但是当我试图检索我需要的td元素时

totalQbHurrys = soup.find('div', {'id':'all_detailed_defense'}).find('td', {'data-stat':'qb_hurry'})

它返回None,我认为我要查找的文本首先是作为注释存在的,但是我很难找到我需要的实际HTML元素。有人知道一种成功地瞄准qb_hurry元素的方法吗


Tags: 文本div信息id元素resallfind
3条回答

您需要的HTML位于注释中,因此在soup中不会直接可见。您需要首先获取注释,然后将其解析为一个新的soup对象。然后可以从中找到trth元素。例如:

from bs4 import BeautifulSoup, Comment
import requests

res = requests.get('https://www.pro-football-reference.com/players/D/DonaAa00.htm')
soup = BeautifulSoup(res.text, 'html.parser')
div = soup.find('div', {'id':'all_detailed_defense'})
comment_html = div.find(string=lambda text: isinstance(text, Comment))
comment_soup = BeautifulSoup(comment_html, 'html.parser')

for tr in comment_soup.find_all('tr'):
    row = [td.text for td in tr.find_all(['td', 'th'])]
    print(row)

给你:

['', 'Games', 'Pass Coverage', 'Pass Rush', 'Tackles']
['Year', 'Age', 'Tm', 'Pos', 'No.', 'G', 'GS', 'Int', 'Tgt', 'Cmp', 'Cmp%', 'Yds', 'Yds/Cmp', 'Yds/Tgt', 'TD', 'Rat', 'DADOT', 'Air', 'YAC', 'Bltz', 'Hrry', 'QBKD', 'Sk', 'Prss', 'Comb', 'MTkl', 'MTkl%']
['2018*+', '27', 'LAR', 'DT', '99', '16', '16', '0', '1', '0', '0.0%', '0', '', '0.0', '0', '39.6', '-2.0', '0', '0', '0', '30', '19', '20.5', '70', '59', '6', '9.2%']
['2019*+', '28', 'LAR', 'DT', '99', '16', '16', '0', '0', '0', '', '0', '', '', '0', '', '', '0', '0', '0', '32', '9', '12.5', '55', '48', '6', '11.1%']
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import pandas as pd

options = Options()
options.add_argument(' headless')

driver = webdriver.Firefox(options=options)

driver.get("https://www.pro-football-reference.com/players/D/DonaAa00.htm")

df = pd.read_html(driver.page_source, attrs={
                  'class': 'row_summable sortable stats_table now_sortable'}, header=1)[0]

print(df.loc[1, 'Hrry'])

driver.quit()

输出:

32

问题是该字段位于HTML注释标记内

这是一项决议:

import bs4
import requests

res = requests.get('https://www.pro-football-reference.com/players/D/DonaAa00.htm')

soup = bs4.BeautifulSoup(res.text, 'html.parser')

extract = soup.find('div', {'id':'all_detailed_defense'})

for comments in extract.find_all(text=lambda text:isinstance(text, bs4.Comment)):
    comments.extract()

soup2 = bs4.BeautifulSoup(comments, 'html.parser')

totalQbHurrys = soup2.find('td', {'data-stat':'qb_hurry'})

print(totalQbHurrys)

PS:我用过这个技巧:https://stackoverflow.com/a/52874885/2186074

相关问题 更多 >