如何在数据库中存储HTML(SQLITE PYTHON)

3 投票
1 回答
4157 浏览
提问于 2025-04-16 08:41

这可能看起来很简单,但我就是搞不定……

我该如何在 SQLITE 数据库中存储 HTML 代码呢?

我在数据库中为这个字段使用的是文本类型(难道应该用 blob 吗?)

我遇到了一些奇怪的错误(而且同样的输入会出现不同的错误,所以我觉得这可能跟转义有关)

我的代码:

con = sqlite.connect(bd)
cur = con.cursor()
temp=cur.execute ('SELECT * from posts').fetchall()
#temp[Z][1] = ID
#temp[Z][4] = URL
i=0
while i< len (temp):
    if temp[i][0]==None:
        try:
            html = urllib2.urlopen(str(temp[i][4])).read()
        except:
            html=None
        #sql = 'UPDATE posts SET html = "' + str(html) + '" WHERE  id = ' +  str(temp[i][1])
        #cur.execute( 'UPDATE posts SET html = ? WHERE  id = ?' ,(html,temp[i][1]) )
        cur.execute("UPDATE posts SET html = '" + str(html) + "' WHERE  id = " +  str(temp[i][1]))
        con.commit()
        print temp[i][4]
    i=i+1

错误信息:

1 -

操作错误:在 "2" 附近:语法错误 警告:执行文件失败: Python 2.6.5 (r265:79063, 2010年4月16日, 13:09:56) 输入 "copyright", "credits" 或 "license" 获取更多信息。

2-

编程错误:你不能使用 8 位字节字符串,除非你使用一个 可以解释 8 位字节字符串的 text_factory(比如 text_factory = str)。 强烈建议你 直接将应用程序切换到 Unicode 字符串。

附言:我更希望它是文本(人类可读的),而不是 blob,但如果这样更简单,我也没问题。

谢谢

1 个回答

3

试试这个:

cur.execute(
    "UPDATE posts SET html = ? WHERE id = ?", (html ,temp[i][1]))

使用参数化的参数,这样sqlite3就能帮你处理引号的问题了。(这也能帮助防止SQL注入。)

关于编程错误:html应该是一个unicode对象,而不是一个string对象。当你打开这个网址时:

response=urllib2.urlopen(str(temp[i][4]))

查看内容类型的头信息:

content_type=response.headers.getheader('Content-Type')
print(content_type)

它可能会显示类似于

'text/html; charset=utf-8'

的内容,这种情况下你应该用utf-8编码来解码html字符串:

html = response.read().decode('utf-8')

这样就能把html变成一个unicode对象,并且(希望)能解决ProgrammingError的问题。

撰写回答