html2text:如何解析包含特殊字符的网址?

时间:2017-12-07 21:33:57

标签: python python-2.7 url encoding

我试图使用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编码器?

1 个答案:

答案 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.closeouttext = nochr.join(self.outtextlist),其中nochrunicode('')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方法。