美丽的汤将S& P变成S& P; AT& T进入AT& T; ?

时间:2013-12-16 13:57:44

标签: python beautifulsoup html-entities

我正在使用BeautifulSoup 4(4.3.2)解析一些相当混乱的HTML文档,并且遇到了一个问题,它会变成公司名称,如S&P(标准和普尔)或{{1} (Marks and Spencer)M&S加入AT&TS&P;M&S;。所以它希望将AT&T;模式完成到html实体中,但实际上并不使用html实体查找表,因为&[A-Z]+不是html实体。

如何让它不这样做,或者我只需要正则表达式匹配无效实体并将其更改回来?

&P;

我在OSX 10.8.5 Python 2.7.5和Scientifix Linux 6 Python 2.7.5上尝试了上述内容

1 个答案:

答案 0 :(得分:3)

这似乎是BeautifulSoup4处理未知HTML实体引用的方式中的错误或功能。正如Ignacio在上面的评论中所说,预处理输入并替换'&'可能会更好。带有HTML实体的符号('& amp;')。

但如果你不想出于某种原因这样做 - 我唯一能找到解决问题的方法就是“修补”代码。这个脚本适合我(Mac OS X上的Python 2.73):

import bs4

def my_handle_entityref(self, name):
     character = bs4.dammit.EntitySubstitution.HTML_ENTITY_TO_CHARACTER.get(name)
     if character is not None:
         data = character
     else:
         #the original code mishandles unknown entities (the following commented-out line)
         #data = "&%s;" % name
         data = "&%s" % name
     self.handle_data(data)

bs4.builder._htmlparser.BeautifulSoupHTMLParser.handle_entityref = my_handle_entityref
soup = bs4.BeautifulSoup('AT&T announces new plans')
print soup.text
soup = bs4.BeautifulSoup('AT&TOP announces new plans')
print soup.text

它产生输出:

AT&T announces new plans
AT&TOP announces new plans

您可以在此处查看问题的方法:

http://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/builder/_htmlparser.py#L81

问题就在这里:

http://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/builder/_htmlparser.py#L86