BeautifulSoup学习笔记----过滤器
文档地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#
1、from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc) 获取的其实是按编码规则编码的HTML代码
2、
find_all( name , attrs , recursive , text , **kwargs )
find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:
soup.find_all("title")# [The Dormouse's story]soup.find_all("p","title")
# [The Dormouse's story]
soup.find_all("a")
# [Elsie,# Lacie,# Tillie]
soup.find_all(id="link2")
# [Lacie]
importresoup.find(text=re.compile("sisters"))
# u'Once upon a time there were three little sisters; and their names were\n'
有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:
data_soup=BeautifulSoup('foo!')data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression
但是可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:
data_soup.find_all(attrs={"data-foo":"value"})
# [foo!]
按CSS搜索
按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_ 参数搜索有指定CSS类名的tag:
找到a标签的属性为href的所有值
soup = BeautifulSoup(r.text)
for link in soup.findAll("a"):
if 'href' in link.attrs:
print(link.attrs['href']
limit 参数
find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.
文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:
recursive 参数
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .
一段简单的文档:
像调用 find_all() 一样调用tag
find_all() 几乎是Beautiful Soup中最常用的搜索方法,所以我们定义了它的简写方法. BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:
find()
find( name , attrs , recursive , text , **kwargs )
find_all() 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法.下面两行代码是等价的:
ERROR:
总是出错,之前都可以find().text这样用,不知道为什么这次不可以
AttributeError: 'NoneType' object has no attribute 'text'
sosososososo confused!
要在多个一样CSS名字的标签中去寻
终于都可以了