我在使用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 & 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.gz和http://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 & baz</option>]
15:24:41 pataluc ~ % python stack.py 4.2.1
Beautiful Soup 4.2.1
[<option>foo</option>, <option>bar & baz</option>, <option>qux</option>]
所以我想我的问题已经结束了。感谢您的评论谁让我意识到这是一个版本问题。
答案 0 :(得分:1)
正如我在编辑的第一篇文章中所说的,它是BeautifulSoup 4.2.0中的一个错误,我下载了4.2.1并且错误消失了。
答案 1 :(得分:0)
&
来输入所谓的 HTML实体。例如,<
是HTML中的特殊符号,因为它会启动标记,因此您使用<
代替。
因此,&
本身也是一个特殊符号,您应该使用&
作为文字&符号。你的HTML无效,BeautifulSoup修复了它。
答案 2 :(得分:0)
&之前写的&是HTML语言的一部分,但是您可以在BeautifulSoup之前使用html.escape,然后在必要时使用html.unesacpe