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

时间:2014-07-29 13:55:30

标签: python encoding html-parsing

我正在使用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”,所以我做了以下步骤:

  • 1)我打开了一个名为“apostroph.txt”
  • 的文件
  • 2)我写了“Datiaggregatidell'attivitàamministrativa”。
  • 3)我用第二步的短语作为输入值调用了我的函数。然后我将结果写在另一个文件中
  • 4)我从以下网站复制了(Ctrl + C)步骤2中相同的引用locution: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

1 个答案:

答案 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"