用BeautifulSoup解码HTML实体并存入SQL
我有这段HTML代码:
<h2>
<a href="http://smittenkitchen.com/blog/2008/10/mollys-apple-tarte-tatin/"
rel="bookmark"
title="permanent link to molly’s apple tarte tatin">
molly’s apple tarte tatin</a>
</h2>
而右单引号(’)让我遇到了很多问题。我正在用BeautifulSoup来解析这个内容,但我似乎无法把这些数据转换成可以在SQL数据库中使用的格式。我试图把这些数据格式化成JSON存储到数据库里,但出现了这个错误:
json_encode(): 参数中有无效的UTF-8序列
我只是想把标题存储到SQL中,想让大家更清楚!
3 个回答
1
我建议你看看这个链接:实体转换
根据文档的说明,按需进行修改:
from BeautifulSoup import BeautifulSoup
BeautifulSoup("Sacré bleu!",
convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'
2
虽然这段话并没有直接回答你的问题,但大多数人,包括Beautiful Soup的作者,都推荐从Beautiful Soup转到lxml。我们在一个项目中使用过Beautiful Soup,发现使用lxml后,我们对HTML解析的控制更强,而且遇到的问题也少了很多。
你可以看看 http://lxml.de/
3
给定:
content = '''\
<h2>
<a href="http://smittenkitchen.com/blog/2008/10/mollys-apple-tarte-tatin/"
rel="bookmark"
title="permanent link to molly’s apple tarte tatin">
molly’s apple tarte tatin</a>
</h2>'''
使用 lxml:
import lxml.html as LH
root = LH.fromstring(content)
atag = root.find('a')
print(repr(atag.attrib['title']))
使用 bs4:
import bs4 as bs
soup = bs.BeautifulSoup(content)
atag = soup.find('a')
print(repr(atag.attrs['title']))
使用 BeautifulSoup(版本 3):
import BeautifulSoup as bs
soup = bs.BeautifulSoup(content)
atag = soup.find('a')
print(repr(atag['title']))
每个版本都会打印
u'permanent link to molly\u2019s apple tarte tatin'
这表明每个版本都成功将 HTML 标题解码为 Unicode。
你的数据库适配器应该能够在数据库中存储 Unicode 或者 Unicode 的编码形式。不需要 JSON。