2018-08-08

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:


2018-08-08_第1张图片


找到a标签的属性为href的所有值

soup = BeautifulSoup(r.text)

for link in soup.findAll("a"):

 if  'href' in link.attrs:

  print(link.attrs['href']



2018-08-08_第2张图片

limit 参数

find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.

文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:


recursive 参数

调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .

一段简单的文档:


2018-08-08_第3张图片


像调用 find_all() 一样调用tag

find_all() 几乎是Beautiful Soup中最常用的搜索方法,所以我们定义了它的简写方法. BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:


2018-08-08_第4张图片


find()

find( name , attrs , recursive , text , **kwargs )

find_all() 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法.下面两行代码是等价的:


2018-08-08_第5张图片




ERROR:

总是出错,之前都可以find().text这样用,不知道为什么这次不可以

AttributeError: 'NoneType' object has no attribute 'text'


2018-08-08_第6张图片

sosososososo confused!


2018-08-08_第7张图片

要在多个一样CSS名字的标签中去寻


2018-08-08_第8张图片


2018-08-08_第9张图片



2018-08-08_第10张图片


2018-08-08_第11张图片


终于都可以了


2018-08-08_第12张图片

人有几猪,屎过先知


你可能感兴趣的:(2018-08-08)