gpt4 book ai didi

python - 使用 python 编辑 html,但 lxml 将漂亮的 html 实体转换为奇怪的编码

转载 作者:太空狗 更新时间:2023-10-29 18:25:57 24 4
gpt4 key购买 nike

我正在尝试使用 python(使用 pyquery 和 lxml)来更改和清理一些 html。

Eg. html = "<div><!-- word style><bleep><omgz 1,000 tags><--><p>It&#146;s a spicy meatball!</div>"

lxml.html.clean 函数 clean_html() 运行良好,除了它取代了漂亮的 html 实体,如

&#146; 

一些unicode字符串

\xc2\x92

unicode 在不同的浏览器(使用自动编码的 firefox 和 opera、utf8、latin-1 等)中看起来很奇怪,就像一个空盒子。如何停止 lxml 转换实体?我怎样才能用 latin-1 编码得到它?专门为 html 构建的模块会执行此操作似乎很奇怪。

我不能确定那里有哪些字符,所以我不能只使用

replace("\xc2\x92","&#146;").

我试过

clean_html(html).encode('latin-1')

但 unicode 仍然存在。

是的,我会告诉人们停止使用 word 来编写 html,但我会听到整个

"iz th wayz i liks it u cant mak me chang hitlr".

编辑:一个 beautifulsoup 解决方案:

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

最佳答案

有几件事 - 如果您了解它们 - 将导致最简单/最好的解决方案:

  • clean_html() 返回您提供给它的相同类型:如果给它一个字符串,它会返回一个字符串,但如果给它一个 Element 或 ElementTree,它会分别返回一个Element或ElementTree

  • 您可以通过为 lxml.html.tostring() 方法或树的 write() 提供编码选项来控制 Element 或 ElementTree 的序列化方式> 方法(顺便说一句,同样适用于 xml)。例如,您可以使用 encoding='utf-8' 执行此操作。

  • 任何可以在该编码中编码的内容都将作为编码字符串输出,任何不能被“转义”为实体的内容。使用 encoding="ascii" 会将任何非 ascii 字符强制转换为您希望的“漂亮”实体。

放在一起,这意味着:首先将字符串解析为一个元素(如果您愿意,也可以是树),清理它,并根据需要对其进行序列化:

html = lxml.html.fromstring("<div><!-- word style><bleep><omgz 1,000 tags><--><p>It&#146;s a spicy meatball!</div>")
html = clean_html(html)
result = lxml.html.tostring(html, encoding="ascii")

(还有一个稍微肮脏的技巧是在 unicode 字符串的 encode() 方法上使用 errors 参数:尝试使用 s.encode 对包含“特殊”字符的 unicode 字符串进行编码('ascii', 'xmlcharrefreplace') 看看它做了什么...)

关于python - 使用 python 编辑 html,但 lxml 将漂亮的 html 实体转换为奇怪的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4876716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com