无法使用漂亮的汤选择特定的html元素

时间:2019-08-16 07:32:43

标签: python web-scraping beautifulsoup

我试图找到一个嵌套在all_totals id内的链结元素(肯定存在,我检查了)。

import requests
from bs4 import BeautifulSoup, Comment

url = 'https://www.basketball-reference.com/players/a/abdelal01.html'
data = requests.get(url)
html = BeautifulSoup(data.text, 'html.parser')

print(html.select('#all_totals tbody').prettify())

但是,这个漂亮的汤代码仅返回一个空数组。我认为该问题可能是由位于GIANT html注释下的所需元素引起的。我添加了一些代码来尝试解析html以摆脱注释:

for comment in html.findAll(text=lambda text: isinstance(text, Comment)):
    comment.extract()
print(html.select('#all_totals')[0].prettify())

这有助于消除评论;但是,嵌套在“ all_totals” ID中的大多数(但不是全部)HTML在执行此操作后便消失了。

我做错了什么,如何正确选择所需的html?

2 个答案:

答案 0 :(得分:1)

您可以使用selenium直接找到tbody,因为它是由javascript加载的。

尝试一下:

from bs4 import BeautifulSoup, Comment
from selenium import webdriver

url = 'https://www.basketball-reference.com/players/a/abdelal01.html'
driver = webdriver.Firefox()
driver.get(url)
html = BeautifulSoup(driver.page_source)

print(html.find('div', {'id':'all_totals'}).find('tbody').prettify())

for comment in html.findAll(text=lambda text: isinstance(text, Comment)):
    comment.extract()
print(html.find('div', {'id': 'all_totals'}).prettify())

答案 1 :(得分:1)

您不想使用var item = testimonial.GetContent() as TestimonialBlock; if (item != null) { <p>@item.Quote</p> } ,因为您将删除包含感兴趣的html的注释。请参阅以下示例,以代替从注释中提取内容

extract