我正在使用BeautifulSoup 4(4.3.2)解析一些相当混乱的HTML文档,并且遇到了一个问题,它会变成公司名称,如S&P
(标准和普尔)或{{1} (Marks and Spencer)M&S
加入AT&T
,S&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上尝试了上述内容
答案 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