我试图使用Aaron Swartz的Python html2text库(在Python 2.7上)。我没有成功地在包含URL具有特殊字符的链接的字符串上使用html2text()。例如:
# -*- coding: utf-8 -*-
import html2text
s = u'Link <a href="https://en.wikipedia.org/wiki/Málaga">here</a>!'
str = html2text.html2text(s)
失败并显示错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 31: ordinal not in range(128)
鉴于:
# -*- coding: utf-8 -*-
import html2text
s = u'<a href="https://en.wikipedia.org/wiki/Malaga">héré</a>!'
str = html2text.html2text(s)
(它有特殊字符,但只在文本中,而不在URL中)才能正常工作。
我必须遗漏编码的内容,但我无法在文档中找到任何内容。有没有办法告诉html2text在其url解析器中使用非ascii编码器?
答案 0 :(得分:1)
您可以使用urllib.quote
(Python3中的urllib.parse.quote
)对非ascii字符进行编码。 safe
参数中指定的字符将不会被编码。
import html2text
from urllib import quote
s = 'Link <a href="https://en.wikipedia.org/wiki/Málaga">here</a>!'
q = quote(s, safe=' <>="/:!')
s = html2text.html2text(q)
print q
print s
Link <a href="https://en.wikipedia.org/wiki/M%C3%A1laga">here</a>!
Link [here](https://en.wikipedia.org/wiki/M%C3%A1laga)!
你不能在href中使用unicode字符,因为它是用字符串格式化的。
该错误来自第163行中的html2text.HTML2Text.close
:outtext = nochr.join(self.outtextlist)
,其中nochr
为unicode('')
,self.outtextlist
是标记部分的列表:
[u'Link ', '[', u'h\xe9r\xe9', '](https://en.wikipedia.org/wiki/Mlaga)', u'!', '\n', '']
如您所见,包含href的项目不是unicode字符串。
这是因为在html2text.HTML2Text.handle_tag
,在功能link_url
中,第440行,url格式化为字符串:']({url}{title})'.format(url=escape_md(url), title=title)
。
如果您将其更改为unicode(u']({url}{title})'
),您将在self.outtextlist
中获得一个unicode字符串:
[u'Link ', '[', u'h\xe9r\xe9', u'](https://en.wikipedia.org/wiki/Ml\xe1ga)', u'!', '\n','']
,u'Link <a href="https://en.wikipedia.org/wiki/Mlága">héré</a>!'
的输出为:
Link [héré](https://en.wikipedia.org/wiki/Mlága)!
但我不建议修改原始代码。一个可能的解决方案是子类HTML2Text
并覆盖link_url
,但问题是link_url
是一个本地函数,因此您必须覆盖整个handle_tag
方法。