BS4从某些行返回none

时间:2018-03-22 12:40:01

标签: python html web-scraping beautifulsoup

摘要: BS4不会获取某些td元素的内容,返回None而不是它们包含的数据。

详细信息:我尝试使用BS4(下面的代码)抓取HTML表格。该表有多列,如下所示:

<tr>
    <td><b>EICHERMOT</b></td>
    <td>28-Mar-18</td>
    <td>28,079.75</td>
    <td><span class="gr_11" style="color:#0F6C02">0.45</span></td>
    <td><span class="gr_11" style="color:#0F6C02">0.00%</span></td>
    <td>28,560.00<br>
    28,027.05</td>
    <td>28298.25</td>
    <td>49,050<br>
    1,962</td>
    <td>13,880.29</td>
    <td>197,375</td>
    <td><span class="gr_11" style="color:#0F6C02">750<br>
        0.38%</span></td>
</tr>

我用来刮掉桌子的代码:

page = open("topGainers.html")
soup =  BeautifulSoup(page, "lxml")
page.close()

print(soup('table')[1].findAll('tr')[i].findAll('td')[5].string)
# None

此处的问题是,当我运行此代码时,包含td标记的br会返回None。 我知道这是因为它有一个以上的孩子,但我无法解决问题。使用.text代替.string会返回类似

的内容
[u'28,560.00', <br/>, u'\n\t\t\t\t\t\t\t\t28,027.05']

预期产出:

[u'28,560.00 28,027.05']

我应该怎么做?

1 个答案:

答案 0 :(得分:1)

要从文本中删除多余的空格,您只需使用.get_text(' ', strip=True)

即可
html = '''<tr>
    <td><b>EICHERMOT</b></td>
    <td>28-Mar-18</td>
    <td>28,079.75</td>
    <td><span class="gr_11" style="color:#0F6C02">0.45</span></td>
    <td><span class="gr_11" style="color:#0F6C02">0.00%</span></td>
    <td>28,560.00<br>
    28,027.05</td>
    <td>28298.25</td>
    <td>49,050<br>
    1,962</td>
    <td>13,880.29</td>
    <td>197,375</td>
    <td><span class="gr_11" style="color:#0F6C02">750<br>
        0.38%</span></td>
</tr>>'''

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('td')[5].get_text(' ', strip=True))
# 28,560.00 28,027.05