我试图使用python(与pyquery和lxml一起)来修改和清理一些html。
Eg. html = "<div><!-- word style><bleep><omgz 1,000 tags><--><p>It’s a spicy meatball!</div>"
clean函数clean_html()工作得很好,只是它替换了像
’
有一些unicode字符串
\xc2\x92
unicode在不同的浏览器中看起来很奇怪(firefox和opera使用自动编码、utf8、latin-1等),就像一个空框。如何停止lxml转换实体?我怎么才能用拉丁语-1编码呢?似乎很奇怪,专门为html构建的模块会这样做。
我不能确定里面有哪些角色,所以我不能用
replace("\xc2\x92","’").
我试过用
clean_html(html).encode('latin-1')
但是unicode仍然存在。
是的,我会告诉人们停止使用word来编写html,但是我会听到
"iz th wayz i liks it u cant mak me chang hitlr".
编辑:美化组解决方案:
from BeautifulSoup import BeautifulSoup, Comment
soup = BeautifulSoup(str(desc[desc_type]))
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
print soup
我假设
’
应该是引号。字节值为146的str对象是一个引号:所以,你可以这样做:
或者
请注意,引号具有unicode码位值8217。也就是说,
ord(chr(146).decode('cp1252'))
等于8217,所以lh.tostring
返回:你可以在cp1252中重新编码如下:
我不知道怎么哄lxml回来
但是,要匹配美化组代码的输出。很明显,这可以用regex来实现(与我前面所做的相反),但我不知道这是必要的还是可取的,因为lxml应该已经返回了其他应用程序可以理解的html。
您也可以将utf8字符串转换为带xml字符的ascii
有几件事-如果你知道的话-将导致最简单/最好的解决方案:
clean_html()
返回提供给它的相同类型:如果给它一个字符串,它将返回一个字符串,但是如果给它一个元素或元素树,它将分别返回一个元素或元素树您可以通过为
lxml.html.tostring()
方法或树的write()
方法提供编码选项来控制元素或元素树的序列化方式(顺便说一下,xml也是如此)。例如,您可以使用encoding='utf-8'
来实现这一点。任何可以在该编码中编码的内容,都将作为编码字符串输出,任何不能作为实体“转义”的内容。使用
encoding="ascii"
将强制任何非ascii字符按您所希望的方式使用“nice”实体。总而言之,这意味着:首先将字符串解析为一个元素(如果您愿意,可以是树),清理它,然后根据需要序列化它:
(还有一个稍微脏一点的技巧是在unicode字符串的
encode()
方法上使用errors参数:尝试用s.encode('ascii', 'xmlcharrefreplace')
对包含“特殊”字符的unicode字符串进行编码,然后看看它能做什么…)相关问题 更多 >
编程相关推荐