BeautifulSoup标签删除

时间:2013-04-10 19:20:37

标签: python html-parsing beautifulsoup

我正在寻找使用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'。所以是的,理想情况下我只想在标签中找到的文本。

1 个答案:

答案 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]