【问题标题】:Python Beautiful Soup cannot find tablePython Beautiful Soup 找不到表
【发布时间】:2017-12-07 04:05:49
【问题描述】:

我有一个找不到表格的网页抓取代码。 我的代码如下所示:

site = 'http://etfdb.com/compare/market-cap/'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site, headers=hdr)
page = urlopen(req)
soup = BeautifulSoup(page)
table = soup.find('table', {"class":"table mm-mobile-table table-striped 
table-bordered"})

表格 HTML 看起来像:

<table class="table mm-mobile-table table-striped table-bordered" data-
icons-prefix="fa" data-icons="{&quot;columns&quot;:&quot;fa-th&quot;}" data-
striped="true" data-toggle="table">

但由于某种原因,我的代码总是将表返回为无。我不知道为什么,但任何帮助将不胜感激。谢谢。

【问题讨论】:

  • soup 中没有表格(page 中也没有)。可能服务器无法将“Mozilla/5.0”识别为有效代理。

标签: python html web-scraping beautifulsoup


【解决方案1】:

问题是标记不正确导致大部分代码被注释掉,即

<!-->. 

解决方法是替换这些元素,然后解析 HTML。

from urllib2 import urlopen, Request
from bs4 import BeautifulSoup
site = 'http://etfdb.com/compare/market-cap/'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site, headers=hdr)
res = urlopen(req)
rawpage = res.read()
page = rawpage.replace("<!-->", "")
soup = BeautifulSoup(page, "html.parser")
table = soup.find("table", {"class":"table mm-mobile-table table-striped table-bordered"})
print (table)

在 Python 2.7.12 上测试

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
site = 'http://etfdb.com/compare/market-cap/'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site, headers=hdr)
res = urlopen(req)
rawpage = res.read().decode("utf-8") 
page = rawpage.replace('<!-->', '')
soup = BeautifulSoup(page, "html.parser")
table = soup.find("table", {"class":"table mm-mobile-table table-striped table-bordered"})
print (table)

在 Python 3.5.2 上测试

给予:

 <table class="table mm-mobile-table table-striped table-bordered" data-icons='{"columns":"fa-th"}' data-icons-prefix="fa" data-striped="true" data-toggle="table"><thead><tr><th class="show-td" data-field="symbol">Symbol</th> <th class="show-td" data-field="name">Name</th> <th class="show-td" data-field="aum">AUM</th> <th class="show-td" data-field="avg-volume">Avg Volume</th></tr></thead><tbody><tr><td class="show-td" data-th="Symbol"><a href="/etf/SPY/">SPY</a></td> <td class="show-td" data-th="Name"><a href="/etf/SPY/">SPDR S&amp;P 500 ETF</a></td> <td class="show-td" data-th="AUM">$236,737,519.17</td> <td class="show-td" data-th="Avg Volume">73,039,883</td></tr> <tr><td class="show-td" data-th="Symbol"><a href="/etf/IVV/">IVV</a></td> <td class="show-td" data-th="Name"><a href="/etf/IVV/">iShares Core S&amp;P 500 ETF</a></td> <td class="show-td" data-th="AUM">$115,791,603.10</td> <td class="show-td" data-th="Avg Volume">3,502,931</td></tr> ...

【讨论】:

    【解决方案2】:

    我不知道可能是因为他们的代码 [故意] 结构不完善,BeautifulSoup 无法解析它。但也许这对你有帮助:

    import re    # to extract table with regex
    table_soup = BeautifulSoup( re.findall(r'<table.*>.*</table>', page.read())[0] )
    

    您还可以通过以下方式进一步调查:

    for tag in soup.find_all():
       if tag.name == 'div':
          if str(tag).find("table-striped") > -1:
             print repr( str(tag)[:100] )
    

    查看哪些div 标签包含table,如果有的话:

    '<div class="mm-header">\n<div class="container">\n<div class="row">\n<div class="col-xs-12">\n<div class'
    '<div class="container">\n<div class="row">\n<div class="col-xs-12">\n<div class="mm-user-links hidden-x'
    '<div class="row mm-header-content">\n<div class="col-sm-4 mm-header-logos">\n<button class="navbar-tog'
    '<div class="col-sm-4 mm-header-logos">\n<button class="navbar-toggle">\n<span class="fa fa-bars"></spa'
    

    所以我猜 BeautifulSoup 无法将最后一个分解为子标签。

    编辑:

    1. 抱歉忘记加page.read()先获取页面源,再看第二行。

    2. 如果你不想使用正则表达式,你可以使用更好的解析器而不是默认的:html5lib

    首先安装它:

    # pip install html5lib

    您可以通过以下方式使用它:

    soup = BeautifulSoup(page, 'html5lib')

    【讨论】:

      【解决方案3】:

      您需要指定要解析的确切内容

      soup = BeautifulSoup(page, 'html.parser')
      

      那么你就可以很好地验证它是否解析正确

      print(soup.prettify())
      

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 2018-07-27
        • 2013-07-15
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        相关资源
        最近更新 更多