使用Beautifulsoup解析大评论?

时间:2018-11-29 16:03:45

标签: python-3.x beautifulsoup

我正在使用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....

1 个答案:

答案 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")