zoukankan      html  css  js  c++  java
  • Python Beautiful Soup 4

    Beautiful Soup 是一个灵活方便的网页解析库,利用它不用编写正则表达式即可方便地提取的网页信息
    官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

    解析库

    Beautiful Soup 支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器
    主要有几种:

    from bs4 import BeautifulSoup
    BeautifulSoup(markup, "html.parser")		# Python 标准库
    BeautifulSoup(markup, "lxml")				# lxml HTML 解析器
    BeautifulSoup(markup, "xml")				# lxml XML 解析器 = BeautifulSoup(markup, ["lxml", "xml"])
    BeautifulSoup(markup, "html5lib")			# html5lib
    

    官方推荐使用 lxml

    基本使用

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(markup, "lxml")
    print(soup.prettify())
    

    对象

    Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag, NavigableString, BeautifulSoup, Comment

    Tag 对象

    属性

    标签名

    通过 Tag.name 获取 Tag 对象的标签名
    Tag.name 可以被修改,会在当前 BeautifulSoup 对象修改

    属性

    标签的属性存储在字典中
    通过 Tag.attr 可以获取属性字典,也可以直接用 key 查找 Tag[key]
    如果一个属性对应多个值,则会返回一个列表
    属性可以增加、删除、修改

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(markup, "lxml")
    tag = soup.div
    tag['id'] = 'i1'
    tag['class'] = ['c1', 'c2']
    del tag['class']
    print(tag.get('id'))
    

    字符串常被包含在tag内,并用 NavigableString 类包装
    通过 tag.string 获取

    BeautifulSoup 对象

    BeautifulSoup 对象表示的是一个文档的全部内容,大部分时候,可以把它当作 Tag 对象

    选择器

    标签选择器

    通过标签名可以找到第一个匹配的标签,包括它的子标签
    还可以多次调用查找它的子标签
    标签选择器返回的是 Tag 对象

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(markup, "lxml")
    print(soup.tag_name)
    print(soup.parent_tag.child_tag)
    

    子孙节点

    contents

    tag的 .contents 属性可以将 tag 的子节点以列表的方式输出

    children

    通过tag的 .children 生成器,可以对 tag 的子节点进行循环

    list(tag.children) == tag.contents
    

    descendants

    返回一个包含所有 tag 子孙节点的生成器对象

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(markup, "lxml")
    for i, child in enumerate(soup.children):
        print(i, child)
    

    祖先节点

    parent

    通过 .parent 属性来获取某个元素的父节点
    文档顶层节点的父节点是 BeautifulSoup 对象, BeautifulSoup 对象没有父节点(None)

    parents

    返回一个包含所有 tag 祖先节点的生成器对象

    兄弟节点

    next_sibling & previous_sibling

    通过 .next_sibling & .previous_sibling 属性来获取某个元素的后一个 (前一个) 兄弟节点
    如果没有返回 None

    next_siblings & previous_siblings

    通过 .next_siblings & .previous_siblings 属性可以对当前节点的兄弟节点迭代输出

    标准选择器

    find_all

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

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

    通过 name:

    find_all('div')
    

    通过 attr:

    find_all(id='i1')
    find_all(class_='c1')
    find_all(id=True)
    find_all(href=re.compile('cnblogs.com/'))
    find_all(attr={'attr1': '1', 'attr2': '2'})
    

    其他

    find(name, attrs, recursive, text, **kwargs)						# 返回找到的第一个
    
    find_parents(name, attrs, recursive, text, **kwargs)				# 对当前tag的祖先节点进行迭代, 返回所有符合条件的节点
    find_parent(name, attrs, recursive, text, **kwargs)					# 对当前tag的祖先节点进行迭代, 返回第一个符合条件的节点
    
    find_next_siblings(name, attrs, recursive, text, **kwargs)			# 对当前tag的之后的兄弟节点进行迭代, 返回所有符合条件的节点
    find_next_sibling(name, attrs, recursive, text, **kwargs)			# 对当前tag的之后的兄弟节点进行迭代, 返回第一个符合条件的节点
    
    find_previous_siblings(name, attrs, recursive, text, **kwargs)		# 对当前tag的之前的兄弟节点进行迭代, 返回所有符合条件的节点
    find_previous_sibling(name, attrs, recursive, text, **kwargs)		# 对当前tag的之前的兄弟节点进行迭代, 返回第一个符合条件的节点
    
    find_all_next(name, attrs, recursive, text, **kwargs)				# 对当前tag的之后的 tag 和字符串进行迭代, 返回所有符合条件的节点
    find_next(name, attrs, recursive, text, **kwargs)					# 对当前tag的之后的 tag 和字符串进行迭代, 返回第一个符合条件的节点
    
    find_all_previous(name, attrs, recursive, text, **kwargs)			# 对当前tag的之前的 tag 和字符串进行迭代, 返回所有符合条件的节点
    find_previous(name, attrs, recursive, text, **kwargs)				# 对当前tag的之前的 tag 和字符串进行迭代, 返回第一个符合条件的节点
    

    CSS 选择器

    Beautiful Soup支持大部分的CSS选择器, 在 Tag 或 BeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到tag

    soup.select('#i1')				# id 选择,选择 id = 'i1' 的标签
    soup.select('.c1')				# class 选择,选择 class = 'c1' 的标签
    soup.select('body')				# 标签选择,选择所有 body 标签
    soup.select('body a')			# 层级选择,选择 body 标签下的所有 a 标签
    soup.select('body > a')			# 层级选择,选择 body 标签下一层的所有 a 标签
    soup.select('[attr1= "attr1"]')	# 属性选择,选择所有 attr1 属性为 attr1 的标签
    

    输出

    格式化输出

    prettify() 方法将 Beautiful Soup 的文档树格式化后以 Unicode 编码输出,每个 XML/HTML 标签都独占一行


    通过 Beautiful Soup 4 预防 XSS 攻击 <--点击查看

  • 相关阅读:
    赫夫曼树相关算法
    用栈来实现 括号匹配 字符序列检验
    二叉树的建立和遍历
    数据结构-算术表达式求值
    构造一个单链表L,其头结点指针为head,编写程序实现将L逆置
    单链表的基本操作(C语言)数据结构
    java代码打印杨辉三角
    无标题
    写一个方法,判断给定的数字是偶数还是奇数
    关于生物信息学与R的相关资料和网站
  • 原文地址:https://www.cnblogs.com/dbf-/p/11426118.html
Copyright © 2011-2022 走看看