2011-09-14 35 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。