我正在寻找使用Python / BeautifulSoup解析HTML表...
这是我在Python中编写任何代码的第一次尝试,所以它可能不是最有效的。
我在这里抓了一个函数另一个帖子(大部分都很好用),但我遇到了几个问题。
我正在运行的代码在这里:
def strip_tags(html, invalid_tags):
bs2 = BeautifulSoup(str(html))
for tag in bs2.findAll(True):
if tag.name in invalid_tags:
s = ""
for c in tag.contents:
if not isinstance(c, NavigableString):
c = strip_tags(unicode(c), invalid_tags)
s += unicode(c)
tag.replaceWith(s)
return bs2
invalid_tags = ['td','b']
for row in bs.findAll('tr'):
col = row.findAll('td')
for index,item in enumerate(col):
t = item.findAll('a')
for ta in t:
ta.replaceWithChildren()
col[index] == item
for item in col:
print(strip_tags(item.string,invalid_tags).string
原始数据表(HTML)如下所示:
<td align="left">11/10</td>
<td>N ARMY</td>
<td>-7.5</td>
<td>NL</td>
<td><b>76-65</b></td>
<td><span style="color:green">W</span></td>
<td><span style="color:green">W</span></td>
<td></td>
<td class="cell4">50.0%</td>
<td class="cell4">76.9%</td>
<td class="cell4">37.5%</td>
<td class="cell5">37.1%</td>
<td class="cell5">90.0%</td>
<td class="cell5">29.4%</td>
当我运行strip_tags函数时,它适用于除第二行之外的所有标记...'无'作为输出返回。
如果有人能够提供有关为何发生这种情况的任何见解,我将不胜感激。
编辑:哇谢谢大家的快速回复。无论如何,这是我运行代码时会发生的事情:
11/10 None -7.5 NL 76-65 W W None 50.0% 76.9% 37.5% 37.1% 90.0% 29.4%
问题在于第二行,它返回'None'而不是'N ARMY'。所以是的,理想情况下我只想在标签中找到的文本。
答案 0 :(得分:1)
如果我理解你想要的输出,你不需要手动删除标签 - 这就是我们使用BeautifulSoup
的原因! ;)
您需要调用的是get_text()
返回tag
个实例的find_all()
方法。
使用您的示例html:
<table>
<tr>
<td align="left">11/10</td>
<td>N ARMY</td>
<td>-7.5</td>
<td>NL</td>
<td><b>76-65</b></td>
<td><span style="color:green">W</span></td>
<td><span style="color:green">W</span></td>
<td></td>
<td class="cell4">50.0%</td>
<td class="cell4">76.9%</td>
<td class="cell4">37.5%</td>
<td class="cell5">37.1%</td>
<td class="cell5">90.0%</td>
<td class="cell5">29.4%</td>
</tr>
</table>
对td
的简单迭代,以及对get_text()
的调用,我们很高兴!
from bs4 import BeautifulSoup
with open('test.html', 'rb') as html: #My local version of your html file
soup = BeautifulSoup(html.read())
for td in soup.find_all('td'):
print td.get_text()
这给出了输出:
11/10
N ARMY
-7.5
NL
76-65
W
W
50.0%
76.9%
37.5%
37.1%
90.0%
29.4%
[Finished in 0.1s]