2013-04-10 120 views
1

我一直在找解析HTML表格与Python/BeautifulSoup ...BeautifulSoup标签去除

这是我在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的功能,它适用于所有标签第二行除外......“None”作为输出返回。

如果任何人都可以提供任何有关发生这种情况的见解,我将不胜感激。

编辑:哇谢谢大家的快速回复。总之,这里是当我运行的代码会发生什么:

 
11/10 
None 
-7.5 
NL 
76-65 
W 
W 
None 
50.0% 
76.9% 
37.5% 
37.1% 
90.0% 
29.4%

问题在于围绕第二线,它会返回,而不是“N军队”“无”。所以,是的,理想情况下,我只想在标签中找到的文字。

+2

是你在找什么输出呢? BeautifulSoup也有'.stripped_strings'迭代,这使得大多数这不必要,如果你想要的只是表中的文本。 – 2013-04-10 19:27:30

+0

您的缩进看起来不对;对于index,枚举项(col):'和'for col in:'块应该*可能*被缩进为前面'for'循环的一部分。 – 2013-04-10 19:29:16

+0

你提供了输入html,但我很困惑你想从它输出什么。你能发布它*应该*返回的内容吗? – 2013-04-10 19:30:13

回答

1

如果我正确理解您想要的输出,您不需要手动去除标签 - 这就是为什么我们使用BeautifulSoup! ;)

您需要调用的是返回的tag实例上的get_text()方法。

使用您的样本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 S,并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] 
+0

真棒,这很好。非常感谢。 – user2267232 2013-04-10 21:41:29