BeautifulSoup使用
简介
BeautifulSoup是一种解析html,xml等文档的解析修改等操作的工具。
安装
pip install beautifulsoup4
初始化BeautifulSoup库
BeautifulSoup(markup,parser)
markup是html或者xml标记的文档
parser是解析器,支持html.parser(python自带解析器),lxml(需要额外韩妆),html5lib(额外安装)
BeautifulSoup(markup, “html.parser”)
BeautifulSoup(markup, “lxml”)
BeautifulSoup(markup, “html5lib”)
import requests #导入requests库获取网站页面代码
from bs4 import BeautifulSoup#导入BeautifulSoup库,注意导入要用bs4
doc = requests.get('https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html')#获取bs4库的html代码
soup = BeautifulSoup(doc.text,'html.parser')#初始化bs4对象,第一个参数是html文档内容,第二个参数是使用的解析器
获取标签及属性
#-------------获取文档首个标签-----------------------
soup.a#获取第一个a标签
'''
<a accesskey="I" href="genindex.html" title="General Index">index</a>
'''
#------------获取文档全部该类型标签---------------------
soup.find_all('a')#获取所有的a标签
soup.find_all('a',href='#id25')#获取所有href=‘#id25’的a标签
#------------获取单个父元素-------------------
soup.a.parent#获取该标签的父元素
'''
<li class="right" style="margin-right: 10px">
<a accesskey="I" href="genindex.html" title="General Index">index</a></li>
'''
#------------获取全部父元素------------------
soup.a.parents#获取该标签所有父元素,返回的事生成器,需要迭代遍历
'''
<generator object parents at 0x7ff1cac1cfc0>
'''
#-----------获取自己的孩子------------------
soup.ul.children#获取该节点直接孩子,返回迭代器
'''
<list_iterator object at 0x7ff1caafa908>
'''
soup.ul.contents#获取直接孩子,返回list
#-----------获取所有子孙------------------
soup.ul.descendants#获取所有子孙节点,返回生成器
'''
<generator object descendants at 0x7ff1cac1cfc0>
'''
#-----------获取兄弟节点------------------
#html文档是一个树形结构,所以兄弟也有前后
#获取下一个兄弟
soup.a.next_sibling
#获取前一个兄弟
soup.a.previous_sibling
#-----------获取内容------------------
#如果标签只有一个NavigableString 类型子节点可以使用string获取内容
soup.title.string
'''
Beautiful Soup 4.2.0 文档 — Beautiful Soup 4.2.0 documentation
'''
soup.a.attrs#获取第一个a标签所有属性和值,返回字典形式
'''
{'accesskey': ['I'], 'href': 'genindex.html', 'title': 'General Index'}
'''
find_all( name , attrs , recursive , text , **kwargs )
- find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.
- name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉,搜索 name 参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True,如果为True就是返回所有tag。
- 如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.
- 可以使用 limit 参数限制返回结果的数量.
- 如果只想搜索tag的直接子节点,可以使用参数 recursive=False
- 注意:如果是tag的class属性需要使用
class_
因为class是Python的关键字,所以需要使用class_来代替或者soup.find_all("a", attrs={"class": "sister"})
,class可以使用多个值class_=’a b’属性a b顺序和匹配一直,否则不能匹配。
#查找多个标签
soup.find(['a','ul'])#返回所有a和ul标签,结果为list
#多条件查找
soup.find_all('a', href="#id73")#查找tag名为a并且href=“#id73”的标签
#使用这则表达式查找
soup.find_all(href=re.compile(r'#id\d*?'), limit=10)#返回10条href符合该正则表达式的标签
#另一种调用方式tag() ==> tag.find_all()
soup('a') #和soup.find_all('a')一样
find函数
和find_all
类似,不过,find_all
返回的是集合,而find返回的是单个元素
soup.find('a')#返回改tag下的第一个a标签
#另一种形式tag.tag
soup.a #和soup.find('a')一样
其他的用法大家参考以下文档
参考文档:
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html