BeautifulSoup4:文本中的&符号

时间:2013-06-05 12:19:34

标签: python html python-2.7 beautifulsoup

我在使用BeautifulSoup4时遇到了问题...(我是一个很棒的Python / BeautifulSoup新手,如果我笨,请原谅我)

为什么以下代码:

from bs4 import BeautifulSoup

soup_ko = BeautifulSoup('<select><option>foo</option><option>bar & baz</option><option>qux</option></select>')
soup_ok = BeautifulSoup('<select><option>foo</option><option>bar and baz</option><option>qux</option></select>')

print soup_ko.find_all('option')
print soup_ok.find_all('option')

产生以下输出:

[<option>foo</option>, <option>bar &amp; baz</option>]
[<option>foo</option>, <option>bar and baz</option>, <option>qux</option>]

我期待同样的结果,我的3个选项的数组......但BeautifulSoup似乎不喜欢文本中的&符号?如何在不编辑HTML(或通过转换/转换)的情况下摆脱这种情况并获得正确的数组?

感谢,

编辑:看起来像4.2.0错误...我下载了4.2.0和4.2.1版本(来自http://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/beautifulsoup4-4.2.0.tar.gzhttp://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/beautifulsoup4-4.2.1.tar.gz),解压缩在我的脚本文件夹中,将我的代码更改为:

import sys
sys.path.insert(0, "beautifulsoup4-" + sys.argv[1])
from bs4 import BeautifulSoup, __version__

print "Beautiful Soup %s" % __version__
soup_ko = BeautifulSoup('<select><option>foo</option><option>bar & baz</option><option>qux</option></select>')
print soup_ko.find_all('option')

得到了结果:

15:24:38 pataluc ~ % python stack.py 4.2.0
Beautiful Soup 4.2.0
[<option>foo</option>, <option>bar &amp; baz</option>]
15:24:41 pataluc ~ % python stack.py 4.2.1
Beautiful Soup 4.2.1
[<option>foo</option>, <option>bar &amp; baz</option>, <option>qux</option>]

所以我想我的问题已经结束了。感谢您的评论谁让我意识到这是一个版本问题。

3 个答案:

答案 0 :(得分:1)

正如我在编辑的第一篇文章中所说的,它是BeautifulSoup 4.2.0中的一个错误,我下载了4.2.1并且错误消失了。

答案 1 :(得分:0)

HTML中使用

&来输入所谓的 HTML实体。例如,<是HTML中的特殊符号,因为它会启动标记,因此您使用&lt;代替。

因此,&本身也是一个特殊符号,您应该使用&amp;作为文字&符号。你的HTML无效,BeautifulSoup修复了它。

答案 2 :(得分:0)

&之前写的&是HTML语言的一部分,但是您可以在BeautifulSoup之前使用html.escape,然后在必要时使用html.unesacpe