我正在使用html.parser库中的HTMLParser创建一个Web抓取工具。我从每个html页面得到一些字符串,我用以下函数修改它们。实际上,以下函数旨在从输入字符串中的每个单词中删除意大利语介词和文章:
def delApostrophedPrepositions(string):
p = re.compile(r'\b[^\s/-]+\b')
string = p.findall(string)
apostrophedPrepArt = ["d'", "all'", "dall'", "tr'", "s'", "sull'", "dell'", "nell'", "l'"]
i = 0
while i < len(string):
#print(string[i])
for ap in apostrophedPrepArt:
#print(ap)
if string[i].startswith(ap):
#print(frase[i])
string[i] = string[i][len(ap):]
i = i + 1
return " ".join(string)
如果我传递给我在代码中写的函数短语,该函数有效,但我发现了一个奇怪的行为,我既不能解释也不能解决这种行为的原因。我会试着解释一下这个行为: 我发现解析网站时从未修改过“Datiaggregatidell'attivitàamministrativa”,所以我做了以下步骤:
view-source:http://www.regione.emilia-romagna.it/trasparenza/attivita-e-procedimenti
并将其粘贴(Ctrl + V)到新文件中。然后我用该短语作为输入值调用了我的函数。最后,我注意到第3步的结果是正确的:“Datiaggregatiattivitàamministrativa”,但步骤4的结果是不正确的:“Datiaggregatidell'attivitàamministrativa”
我指定在HTMLParser中将convert_charrefs设置为True
答案 0 :(得分:2)
网页中的撇号不是您所期望的那样:
>>> phrase = 'Dati aggregati dell’attività amministrativa'
>>> phrase[19]
'’'
>>> print(ascii(phrase[19]))
'\u2019'
这是一个U+2019 RIGHT SINGLE QUOTATION MARK代码点,不您的代码所需的U+0027 APOSTROPHE代码点。
您需要规范化输入以使用一个字符或扩展匹配以考虑许多不同的Unicode替代品。
在这种情况下,Unidecode可以提供帮助:
>>> from unidecode import unidecode
>>> unidecode(phrase)
"Dati aggregati dell'attivita amministrativa"
但考虑到à
现已被a
取代。
另一种方法是使用str.translate()
来映射这些字符;你必须先制作自己的桌子:
>>> apostrophes = dict.fromkeys(
... (0x2013, 0x2018, 0x2019, 0x201b, 0x2035, 0x275b, 0x275c),
... "'")
>>> phrase.translate(apostrophes)
"Dati aggregati dell'attività amministrativa"