2

我正在寻找使用 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
没有任何
-7.5
荷兰
76-65
W
W
没有任何
50.0%
76.9%
37.5%
37.1%
90.0%
29.4%

问题在于第二行,它返回“None”而不是“N ARMY”。所以是的,理想情况下,我只想要在标签中找到的文本。

4

1 回答 1

2

如果我正确理解了您想要的输出,则无需手动删除标签-这就是我们使用BeautifulSoup! ;)

您需要调用的是返回的实例get_text()上的方法。tagfind_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>

对 s 进行简单的迭代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]
于 2013-04-10T20:19:49.600 回答