一.安装BeautifulSoup
BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup配合Request使用,能大大提高爬虫效率。
pip install BeautifulSoup
二.常见操作
from bs4 import BeautifulSouphtml_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="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# # 将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄
soup1 = BeautifulSoup("<html>data</html>", 'lxml')
print(soup1)
soup = BeautifulSoup(html_doc, "lxml")
print(soup.title)
print(soup.head)
# 通过点取属性的方式只能获得当前名字的第一个tag:
print(soup.a)
# 如果想要得到所有的<a>标签,或是通过名字得到比一个tag更多的内容的时候,就需要用到 Searching the tree 中描述的方法,比如: find_all()
print(soup.find_all('a')) # return List
print(soup.find(id='link2'))
# 从文档中找到所有<a>标签的链接
for link in soup.find_all('a'):print(link.get('href'))
# # 从文档中获取所有文字内容
print(soup.get_text())
'''
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag , NavigableString , BeautifulSoup , Comment .
'''
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', 'lxml')
tag = soup.b
print(tag.attrs) # print(tag['class']) 两者一样
print(tag.string) # 文本
# tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:
tag.string.replace_with("No longer bold")
print(tag.string)
# '''遍历文档树'''
soup = BeautifulSoup(html_doc, "lxml")
# # .string
# # 如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点:
head_tag = soup.head
print(head_tag.contents)
title_tag = head_tag.contents[0]
print(title_tag)
print(title_tag.contents)
print(title_tag.string)
# 如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None :
# 那么可以使用 .strings 来循环获取
# ----- find_all()参数注解------
# find_all( name , attrs , recursive , text , **kwargs )
# find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
alist = soup.find_all("a", class_="sister")
print(alist)
# 1.通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True .
print(soup.find_all(text="Lacie"))
# 2.limit 参数
# find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.
# 当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.
print(soup.find_all("a", limit=2))
# 3.recursive 参数
# 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,
# 可以使用参数 recursive=False .
# 4.name 参数¶
# name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.
soup.find_all("a")
# 5.keyword 参数
# 如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,
# Beautiful Soup会搜索每个tag的”id”属性.
soup.find_all(id='link2')