python BeautifulSoup搜索标签

时间:2012-03-30 17:47:30

标签: python beautifulsoup

我在这里的第一篇文章,我试图找到这个特定html中的所有标签,我无法将它们拿出来,这就是代码:

from bs4 import BeautifulSoup
from urllib import urlopen

url = "http://www.jutarnji.hr"
html_doc = urlopen(url).read()
soup = BeautifulSoup(html_doc)
soup.prettify()
soup.find_all("a", {"class":"black"})

查找函数返回[],但是我看到html中有类的标签:“black”,我会错过什么吗?

谢谢, 韦德兰

4 个答案:

答案 0 :(得分:2)

我也有同样的问题。

<强>尝试

soup.findAll("a",{"class":"black"})

而不是

soup.find_all("a",{"class":"black"})

soup.findAll()对我有用。

答案 1 :(得分:1)

它似乎对我有用,所以我会说你的HTML文档存在问题。

我试图运行以下内容:

from bs4 import BeautifulSoup

html_doc = """<html>
 <body>
  <a class="black">
   <b>
    text1
   </b>
   <c>
    text2
   </c>
  </a>
  <a class="micio">
  </a>
  <a class="black">
  </a>
 </body>
</html>"""
soup = BeautifulSoup(html_doc)
soup.prettify()
print(soup.find_all("a", {"class":"black"}))

作为输出我得到了:

[<a class="black">
<b>
    text1
   </b>
<c>
    text2
   </c>
</a>, <a class="black">
</a>]

编辑:正如@Puneet所指出的那样,问题可能是您提取的html中的属性之间缺少空格。

我试图将上面的示例更改为:

html_doc = """<html>
 <body>
  <aclass="black">

# etc.. as before

我得到一个空列表:[]

答案 2 :(得分:1)

这里的问题是网站的类标签与href属性值的末尾没有空格分隔。 BeautifulSoup似乎并没有很好地处理这个问题。可重现的测试用例如下

>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">').prettify()
'<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">\n</a>'
>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/"class="black">').prettify()
''

答案 3 :(得分:0)

使用lxml的接缝解决了这个问题:

from bs4 import BeautifulSoup
import lxml
from urllib import urlopen

url = "http://www.jutarnji.hr"
html_doc = urlopen(url).read()
soup = BeautifulSoup(html_doc, "lxml")
soup.prettify()

soup.find_all("a", {"class":"black"})