1

我在使用 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>]

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

4

3 回答 3

2

&在 HTML 中用于输入所谓的HTML 实体。例如,<是 HTML 中的一个特殊符号,因为它开始一个标签,所以你使用它&lt;来代替。

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

于 2013-06-05T12:28:58.390 回答
1

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

于 2013-06-18T12:10:45.250 回答
0

如前所述,& 是 HTML 语言的一部分,但如果需要,您可以在 BeautifulSoup 之前使用 html.escape 并在之后使用 html.unesacpe

于 2020-01-19T16:14:53.867 回答