我正在尝试从此网站https://www.basketball-reference.com/boxscores/201101100CHA.html上的Four Factors
表中提取数据。我上桌遇到了麻烦。我尝试过
url = https://www.basketball-reference.com/boxscores/201101100CHA.html
html = requests.get(url).content
soup = BeautifulSoup(html,"html.parser")
div = soup.find('div',id='all_four_factors')
然后,当我尝试使用tr = div.find_all('tr')
拉行时,我什么也没回来。
答案 0 :(得分:3)
我看了一下您要抓取的HTML代码,问题是您要获取的标签都在注释部分<!-- Like this --->
中。 BeautifulSoup会将内部注释视为一堆文本,而不是实际的HTML代码。因此,您要做的就是获取注释的内容,然后将此字符串放回BeautifulSoup中:
import requests
from bs4 import BeautifulSoup, Comment
url = 'https://www.basketball-reference.com/boxscores/201101100CHA.html'
html = requests.get(url).content
soup = BeautifulSoup(html,"html.parser")
div = soup.find('div', id='all_four_factors')
# Get everything in here that's a comment
comments = div.find_all(text=lambda text:isinstance(text, Comment))
# Loop through each comment until you find the one that
# has the stuff you want.
for c in comments:
# A perhaps crude but effective way of stopping at a comment
# with HTML inside: see if the first character inside is '<'.
if c.strip()[0] == '<':
newsoup = BeautifulSoup(c.strip(), 'html.parser')
tr = newsoup.find_all('tr')
print(tr)
对此的一个警告是,BS将假定注释掉的代码是有效的,格式正确的HTML。不过,这对我有用,因此,如果页面保持相对不变,它将继续工作。
答案 1 :(得分:2)
如果您查看list(div.children)[5]
,这是唯一将tr
作为子字符串的子级,您会意识到它是Comment
对象,因此从技术上讲该tr
节点下没有div
元素。因此,div.find_all('tr')
应该为空。
答案 2 :(得分:0)
你为什么这样做:
div = soup.find('div',id='all_four_factors')
这将得到以下行,并尝试在其中搜索“ tr”标签。
<div id="all_four_factors" class="table_wrapper floated setup_commented commented">
您可以只使用第一部分中的原始汤变量并执行
tr = soup.find_all('tr')