摘要: 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']
我应该怎么做?
答案 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