Python 解析网站(html)和获取字符串时出现编码问题

Python 解析网站(html)和获取字符串时出现编码问题,python,encoding,html-parsing,Python,Encoding,Html Parsing,我正在使用html.parser库中的HTMLParser制作一个web scrawler。我从每个html页面获取一些字符串,并使用以下函数修改它们。实际上,以下功能旨在从输入字符串中的每个单词中删除意大利语介词和冠词: def delApostrophedPrepositions(string): p = re.compile(r'\b[^\s/-]+\b') string = p.findall(string) apostrophedPrepArt = ["d'",

我正在使用html.parser库中的HTMLParser制作一个web scrawler。我从每个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)
def del撇号介词(字符串):
p=重新编译(r'\b[^\s/-]+\b')
string=p.findall(字符串)
撇号prepart=[“d'”,“all',“dall'”,“tr',“s',“sull',“dell',“nell',“l'”]
i=0
当我
如果我传递到我在代码中编写的函数短语,该函数会工作,但我检测到一种奇怪的行为,我无法解释或解决该行为的原因。我将尝试解释这种行为: 我发现在解析网站时,“Dati aggregati dell'attivitáamministariva”一词从未被修改,因此我采取了以下步骤:

  • 1) 我打开了一个名为“撇号.txt”的文件
  • 2) 我在里面写了“Dati aggregati dell'attivitáamministariva”
  • 3) 我用第二步的短语作为输入值调用了我的函数。然后我将结果写入另一个文件中
  • 4) 我已从以下网站复制了(Ctrl+C)步骤2中相同的引用语句:
    查看源代码:http://www.regione.emilia-romagna.it/trasparenza/attivita-e-procedimenti
    我已经将它(Ctrl+V)粘贴到一个新文件中。然后我用这个短语作为输入值调用了我的函数
最后,我注意到步骤3的结果是正确的:“Dati aggregati attivitáAmministativa”,但步骤4的结果是错误的:“Dati aggregati dell'attivitáAmministativa”


我指定在HtmlPasser中将convert_charrefs设置为True

网页中的撇号不是您所期望的:

>>> phrase = 'Dati aggregati dell’attività amministrativa'
>>> phrase[19]
'’'
>>> print(ascii(phrase[19]))
'\u2019'
这是一个代码点,不是您的代码寻找的代码点

您需要将输入标准化以使用一个字符,或者扩展匹配以考虑许多不同的Unicode替代方案

在这种情况下,可以帮助:

>>> from unidecode import unidecode
>>> unidecode(phrase)
"Dati aggregati dell'attivita amministrativa"
但要考虑到,
a
现在也被
a
所取代

另一种方法是使用地图绘制这些字符;然后,您必须首先制作自己的表格:

>>> apostrophes = dict.fromkeys(
...     (0x2013, 0x2018, 0x2019, 0x201b, 0x2035, 0x275b, 0x275c),
...     "'")
>>> phrase.translate(apostrophes)
"Dati aggregati dell'attività amministrativa"

我怎样才能使我的输入正常化?@Utenestack:你可以用它将许多“外来”撇号映射到
。@Pieters:谢谢。但是我想我可以花几个星期的时间,如果我想把每个角色都映射到地图上的话,这些角色可能会被弄糊涂。我必须在每个网站中找到特定的短语,所以我想我会使用unidecode将我要查找的短语和找到的短语预先转换为ascii,最后比较它们,以了解我是否找到了正确的短语。你觉得我的选择怎么样?是的,这可能是一个更好的方法;如果你只是收集短语的统计数据,那么使用
unidecode
可能是更好的方法。不正确的统计数据…我必须找到特定的短语,以便找到意大利政府网站法律规定的特定链接。我必须说明这些链接是否存在,是否有效