2011-09-14 30 views
2

我正在使用python库SGMLParser来解析一些html。 我遇到的形式使用Python来解析包含“&”的html数据

<td class="school">Texas A&amp;M</td> 

我想读出“德克萨斯A & M”的HTML标签。但是,当handle_data被调用时,它会被调用“Texas A”,然后单独的“M”(为了清晰起见,引号)。

如何更换

&amp; 

串与呼叫之前&,而整个字符串(其中有一些我可能需要)在替换所有特殊的&符号。

谢谢!

回答

4

如果从deprecatedSGMLParser切换到现代的替代,如LXML(也可以用来处理HTML),这将成为微不足道:

>>> etree.fromstring('''<td class="school">Texas A&amp;M</td>''').text 
'Texas A&M' 
+1

SGMLParser已被弃用,因为没有人关心SGML(大多数人使用它来解析HTML,例子)。 XMLParser具有相同的接口并且不被弃用。 lxml应该真的进入stdlib。 – phihag

+0

是的,我也不关心SGML,它看起来像是一种从html中读取数据的“简单”方式。我会研究lxml,谢谢。 – mdeland

1

&amp;实体引用由handle_entity处理。检查此方法是否知道如何翻译&amp;。默认实现应该调用handle_data('&'),但可能会意外覆盖它。

另外,如果可能的话,考虑使用更高级的lxml来代替。

+0

我不认为我覆盖了那个......但是然后handle_data被称为三次'Texas A','&'和'M'对吗?有没有办法让数据加入(如果你知道我的意思)?它看起来像每个人都建议lxml,所以我会研究它。 – mdeland

+1

@mdeland准确地说。你必须自己加入数据; SGMLParser是一个非常低级的接口。 – phihag

2

SGMLParser有convert_entityref()方法,但不推荐使用SGMLParser,我建议使用lxmlBeautiful Soup,它们有更好的解析器API。