用BeautifulSoup解码HTML实体并存入SQL

0 投票
3 回答
1154 浏览
提问于 2025-04-17 19:10

我有这段HTML代码:

<h2>
<a href="http://smittenkitchen.com/blog/2008/10/mollys-apple-tarte-tatin/" 
rel="bookmark" 
title="permanent link to molly&#8217;s apple tarte tatin">
molly&#8217;s apple tarte tatin</a>
</h2>

而右单引号(&#8217)让我遇到了很多问题。我正在用BeautifulSoup来解析这个内容,但我似乎无法把这些数据转换成可以在SQL数据库中使用的格式。我试图把这些数据格式化成JSON存储到数据库里,但出现了这个错误:

json_encode(): 参数中有无效的UTF-8序列

我只是想把标题存储到SQL中,想让大家更清楚!

3 个回答

1

我建议你看看这个链接:实体转换

根据文档的说明,按需进行修改:

from BeautifulSoup import BeautifulSoup
BeautifulSoup("Sacr&eacute; bl&#101;u!", 
               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&#8217;s apple tarte tatin">
molly&#8217;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。

撰写回答