我正在使用BS4解析此webpage: 您会注意到页面上有两个单独的表。这是我的代码的相关片段,该代码已成功从第一个表返回我想要的数据,但在第二个表中找不到任何内容:
# import packages
import urllib3
import certifi
from bs4 import BeautifulSoup
import pandas as pd
#settings
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
gamelog_offense = []
#scrape the data and write the .csv files
url = "https://www.sports-reference.com/cfb/schools/florida/2018/gamelog/"
response = http.request('GET', url)
soup = BeautifulSoup(response.data, features="html.parser")
cnt = 0
for row in soup.findAll('tr'):
try:
col=row.findAll('td')
Pass_cmp = col[4].get_text()
Pass_att = col[5].get_text()
gamelog_offense.append([Pass_cmp, Pass_att])
cnt += 1
except:
pass
print("Finished writing with " + str(cnt) + " records")
Finished writing with 13 records
我已经验证了SECOND表中的数据包含在汤中(我可以看到它!)。经过大量的故障排除后,我发现整个第二张表完全包含在一个大注释中(为什么?)。我已经使用下面的代码设法将此注释提取到单个注释对象中,但是在提取所需数据之后,我无法弄清楚该如何处理。理想情况下,我想以成功解析第一个表的方式解析注释。我已经尝试过使用类似的堆栈溢出问题(硒,phantomjs)中的想法……不走运。
import bs4
defense = soup.find(id="all_defense")
for item in defense.children:
if isinstance(item, bs4.element.Comment):
big_comment = item
print(big_comment)
<div class="table_outer_container">
<div class="overthrow table_container" id="div_defense">
...and so on....
答案 0 :(得分:1)
如果其他人认为有帮助,请在此处发布答案。非常感谢@TomasCarvalho指导我找到解决方案。我可以使用以下代码将大注释作为html传递给第二个汤实例,然后仅在新汤实例上使用原始解析代码。 (请注意:try / except是因为某些团队没有游戏记录,并且您无法在NoneType上调用.children。
try:
defense = soup.find(id="all_defense")
for item in defense.children:
if isinstance(item, bs4.element.Comment):
html = item
Dsoup = BeautifulSoup(html, features="html.parser")
except:
html = ''
Dsoup = BeautifulSoup(html, features="html.parser")