0

我有这个 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>

正确的单引号 (’) 给我带来了各种各样的问题。我正在使用 BeautifulSoup 对其进行解析,但我似乎无法以可以在 SQL 数据库中使用的格式获取这些数据。我尝试从我的数据库中将其格式化为 JSON,但出现此错误:

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

为了清楚起见,我试图将标题存储在 SQL 中!

4

3 回答 3

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 标题解码为 un​​icode。

您的数据库适配器应该能够在数据库中存储 unicode 或 unicode 的编码形式。不需要 JSON。

于 2013-03-15T03:27:18.710 回答
2

虽然没有完全回答您的问题,但似乎大多数人建议从美丽汤中转到 lxml,甚至是美丽汤的作者。我们在一个项目中使用了内部的漂亮汤,发现使用 lxml 可以让我们更好地控制我们正在执行的 HTML 解析,以及更少的奇怪问题。

查看http://lxml.de/

于 2013-03-15T03:12:08.453 回答
1

我建议你尝试实体转换

从文档中,根据需要进行更改:

from BeautifulSoup import BeautifulSoup
BeautifulSoup("Sacr&eacute; bl&#101;u!", 
               convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'
于 2013-03-15T04:10:41.000 回答