Python_爬虫系列_1.BeautifulSoup

内容参考:
文档说明Beautiful Soup

一、使用Beautiful Soup

from bs4 import BeautifulSoup#创建 beautifulsoup 对象
soup = BeautifulSoup(html,'lxml') # 用本地 HTML 文件来创建对象
soup = BeautifulSoup(open("index.html"))#或直接编写HTML
soup = BeautifulSoup("<html>data</html>")

二、案例

	from bs4 import BeautifulSoup
	
	html_doc = """
	<html><head><title>The Dormouse's story</title></head>
	<body>
	<p class="title"><b>The Dormouse's story</b></p>
	<p class="story">Once upon a time there were three little sisters; and their names were
	<a href="https://example.com/elsie" class="sister" id="link1">Elsie</a>,
	<a href="https://example.com/lacie" class="sister" id="link2">Lacie</a> and
	<a href="https://example.com/tillie" class="sister" id="link3">Tillie</a>;
	and they lived at the bottom of a well.</p>
	<p class="story">...</p>
	"""
	
	soup = BeautifulSoup(html_doc)
	print(soup.prettify())  # 美化
	print(soup.title)
	# <title>The Dormouse's story</title>
	
	print(soup.title.name)
	# title
	
	print(soup.title.string)
	# The Dormouse's story
	
	print(soup.title.parent.name)
	# head
	
	print(soup.p)
	# <p class="title"><b>The Dormouse's story</b></p>
	
	print(soup.p['class'])
	# ['title']
	
	print(soup.a)
	# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
	
	print(soup.find_all('a'))
	# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
	#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
	#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
	
	print(soup.find(id="link3"))
	# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
	
	# 从文档中找到所有<a>标签的链接:
	for link in soup.find_all('a'):
	    print(link.get('href'))
	
	# 从文档中获取所有文字内容:
	print(soup.get_text())

	#soup.select(),返回类型是 list
	print soup.select('title') 
	#<title>The Dormouse's story</title>

三、详细介绍

1.text

text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True . 看例子:

代码如下(示例):

soup.find_all("a", text="Elsie")
# [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]

2.limit

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

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

代码如下(示例):

soup.find_all("a", limit=2)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

3.recursive(可递归的)

代码如下(示例):

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("aiolis.html"))
print(soup.find_all("title"))
# [<title>The Dormouse's story</title>]
print(soup.find_all("title", recursive=False))
#[]

4.name

name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.

简单的用法如下:

重申: 搜索 name 参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True
代码如下(示例):

soup.find_all("title")
 [<title>The Dormouse's story</title>]

5.keyword

如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.

简单的用法如下:
代码如下(示例):

soup.find_all(id='link2')
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
#如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性:

soup.find_all(href=re.compile("elsie"))
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

6.attrs

可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:

简单的用法如下:
代码如下(示例):

data_soup.find_all(attrs={"data-foo": "value"})
#[<div data-foo="value">foo!</div>]

7.class(这个很重要)

按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_ 参数搜索有指定CSS类名的tag:

简单的用法如下:
代码如下(示例):

soup.find_all("a", class_="sister")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True :

soup.find_all(class_=re.compile("itl"))
# [<p class="title"><b>The Dormouse's story</b></p>]

def has_six_characters(css_class):
    return css_class is not None and len(css_class) == 6

soup.find_all(class_=has_six_characters)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

1.find()

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

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

soup.find_all('title', limit=1)
# [<title>The Dormouse's story</title>]

soup.find('title')
# <title>The Dormouse's story</title>
#唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.

#find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None .

print(soup.find("nosuchtag"))
# None
#soup.head.title 是 tag的名字 方法的简写.这个简写的原理就是多次调用当前tag的 find() 方#法:

soup.head.title
# <title>The Dormouse's story</title>

soup.find("head").find("title")
# <title>The Dormouse's story</title>

2.find_all()

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

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:

soup.find_all("title")
# [<title>The Dormouse's story</title>]

soup.find_all("p", "title")
# [<p class="title"><b>The Dormouse's story</b></p>]

soup.find_all("a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

soup.find_all(id="link2")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

posted @ 2021-09-28 14:08  cactus9  阅读(11)  评论(0编辑  收藏  举报