使用BeautifulSoup解码HTML实体并存储在SQL中

时间:2013-03-15 03:02:45

标签: python sql beautifulsoup

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

和正确的单引号(&amp;#8217)给了我各种各样的问题。我正在使用BeautifulSoup解析它,我似乎无法以我可以在SQL数据库中使用的格式获取此数据。我试图从我的数据库中将其格式化为JSON,我收到此错误:

json_encode():参数

中的UTF-8序列无效

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

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

查看http://lxml.de/

答案 2 :(得分:1)

我建议你试试Entity Conversion

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

from BeautifulSoup import BeautifulSoup
BeautifulSoup("Sacr&eacute; bl&#101;u!", 
               convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'