python中的阿拉伯语正则表达式和MySQLdb

时间:2012-10-31 21:12:09

标签: python unicode base64 arabic mysql-python

我试图从网页上获取某些阿拉伯字符串,然后将这些字符串存储到数据库中。

第一个问题

唯一可行的方法是使用.指定多少个字母并使用unicode,如下所示:

import urllib,re
content=urllib.urlopen("http://example.com/content.html").read()
content = unicode(content,"utf-8")
Strings = re.findall("<Strong>...........</strong>",content) # it will work fine and fetch it but only strings with 11 char or letter (11 place) 

第二个问题

当我尝试将其写入文本文件时,它会显示:

  

UnicodeEncodeError:'ascii'编解码器无法编码位置0-3中的字符:序数不在范围内(128)

当我试图将其存储到数据库中时,它会显示:

  

ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在'\ xd8 \ xa7 \ xd9 \ x84 \ xd9 \ x82 \ xd8附近使用正确的语法\ xb5 \ xd9 \ x8a \ xd8 \ xb1)'第1行')

我想到的是获取它然后将其编码为base64然后将其存储到db中 但仍然有错误:

  

UnicodeEncodeError:'ascii'编解码器无法编码位置0-3中的字符:序数不在范围内(128)

1 个答案:

答案 0 :(得分:1)

  

我唯一能做的就是用它来指定它们的字母数。并使用unicode,像这样

好的......这是一个问题吗?除了使用正则表达式从HTML中破解字符串的一般不可靠性之外,显然 - 考虑使用适当的解析器(例如lxml.html等)。

  

当我尝试将其写入文本文件时,它会显示:UnicodeEncodeError

文件是字节,因此要写入文本文件,必须将字符编码回字节。例如

with open('file.txt', 'w') as fp:
    fp.write(content.encode('utf-8'))

如果你试图直接写字符,Python会猜测一个编码,通常是ASCII,然后会失败,因为阿拉伯语在ASCII中无法表示。

  

当我尝试将其存储到数据库中时,它会显示:ProgrammingError:(1064,“您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以获得正确使用的语法' \ XD8 \ XA7 \ xd9 \ X84 \ xd9 \ X82 \ XD8 \ XB5 \ xd9 \ x8a \ XD8 \ XB1)'

邮政编码?我不认为这是一个Unicode问题。它看起来更像是在创建一个包含其中内容的查询,而不会使用引号包含该内容。不要这样做 - 使用参数化查询。

c.execute('INSERT INTO something VALUES ('+content+')')     # fails, and security horror
c.execute('INSERT INTO something VALUES (%s)', (content,))  # fine
  

我想到的是获取它然后将其编码为base64

同样,base64对字节而不是字符进行操作,因此首先进行编码。

content.encode('utf-8').encode('base64')

但您不必编码到base64以在数据库中存储Unicode字符。确保使用具有UTF-8排序规则的表列,并使用UTF-8作为连接字符集,并且不需要额外的处理。