03.BeautifulSoup使用

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 )

  1. find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.
  2. name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉,搜索 name 参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True,如果为True就是返回所有tag。
  3. 如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.
  4. 可以使用 limit 参数限制返回结果的数量.
  5. 如果只想搜索tag的直接子节点,可以使用参数 recursive=False
  6. 注意:如果是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

你可能感兴趣的:(python)