zoukankan      html  css  js  c++  java
  • [爬虫] BeautifulSoup库

    Beautiful Soup库基础知识

    Beautiful Soup库是解析xml和html的功能库。html、xml大都是一对一对的标签构成,所以Beautiful Soup库是解析、遍历、维护“标签树”的功能库,只要提供的是标签类型Beautiful Soup库都可以进行很好的解析。

    Beauti Soup库的导入

    from bs4 import BeautifulSoup

    import bs4

    html文档 == 标签树 == BeautifulSoup类   可以认为三者是等价的

    >>>from bs4 import BeautifulSoup  
    >>>soup = BeautifulSoup('<html>data</html>','html.parser')  
    >>>soup1=BeautifulSoup(open(r'D:demo.html'),'html.parser')
    

    简单来说一个BeautifulSoup类对应一个html文档的全部内容。如上面的soup、soup1都对应一个html文档。

    Beautiful Soup类的基本元素

    • Tag 标签            最基本的信息组织单元,分别用<></>开头结尾,通过soup.<标签>获得
    • Name                标签名字,通过<标签>.name获取到
    • Attribute            标签的属性,字典形式,通过<标签>.attrs获取
    • Navigablestring 标签对之间的字符串,通过<标签>.string获取
    • Comment          标签内字符串的注释部分,一种特殊的Comment类型

    soup.标签名  可获得该标签信息,当存在多个一样的标签时,默认返回第一个标签的信息。

    >>> soup=BeautifulSoup(demo,'html.parser')  
    >>> soup.title  
    <title>四大美女</title>  
    >>> soup.a  
    <a href="http://www.baidu.com" target="_blank"><img alt="" heigth="200" src="picture/1.png" title="貂蝉" width="150"/></a>  

    soup.标签.name  可获取标签的名字,以字符串形式返回

    >>> soup.a.name        #获取a标签的名字  
    'a'  
    >>> soup.a.parent.name #获取a标签的上级标签名字  
    'p'  
    >>> soup.a.parent.parent.name #获取a标签的上上级标签的名字  
    'hr'  
    

    soup.标签.attrs  可获得标签的属性,以字典形式返回

    >>> soup.a.attrs      #获取a标签的属性,字典返回  
    {'href': 'http://www.baidu.com', 'target': '_blank'}  
    >>> tag = soup.a.parent  
    >>> tag.name         #获取p标签的属性,字典返回  
    'p'  
    >>> tag.attrs  
    {'align': 'center'}  

    因为返回的是字典可以采用字典的方法对其进行信息的提取。

    >>> for i,j in soup.a.attrs.items(): #for循环遍历字典  
        print(i,j)  
    href http://www.baidu.com  
    target _blank  
    >>> soup.a.attrs['href']             #获取某个key的value值  
    'http://www.baidu.com'  
    >>> soup.a.attrs.keys()              #获取字典所有的keys  
    dict_keys(['href', 'target'])   
    >>> soup.a.attrs.values()            #获取字典所有values  
    dict_values(['http://www.baidu.com', '_blank']) 
    

    soup.标签.string  可以获取标签之间的文本,返回字符串

    >>> soup.title.string   #获取title表之间的文本  
    '四大美女'  
    >>> soup.a.string       #获取a标签之间的文本,没有返回空  
    >>> soup.a  
    <a href="http://www.baidu.com" target="_blank"><img alt="" heigth="200" src="picture/1.png" title="貂蝉" width="150"/></a>  
    

     

    基于bs4库的HTML的遍历方法

    HTML基本格式

    标签树的下行遍历 

    属性及说明 

    • .contents      子节点的列表,将<tag>标签所有儿子节点存入列表
    • .children       子节点的迭代类型,与.content类似,用于循环遍历儿子节点
    • .descendants  子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
    >>> soup.head  
    <head>  
    <meta charset="utf-8">  
    <title>四大美女</title>  
    </meta></head>  
    >>> soup.head.contents                #获取head标签下的儿子节点  
    ['
    ', <meta charset="utf-8">  
    <title>四大美女</title>  
    </meta>]  
    >>> len(soup.body.contents)          #通过len函数获取body标签的儿子节点个数  
    3  
    >>> for i in soup.body.children:     #遍历body标签的儿子节点  
        print(i)  
    >>> for i in soup.body.descendants:  #遍历body标签所有的儿子、子孙节点  
        print(i)  
    

    标签树的上行遍历

    • .parent      当前节点的父亲标签
    • .parents    节点先辈标签的迭代类型,用于循环遍历先辈节点。

    标签树的平行遍历

    • .next_sibling            返回按照html文本顺序的下一个平行节点标签
    • .previous_sibling     返回按照html文本顺序的上一个平行节点标签
    • .next_siblings          迭代类型,返回按照html文本顺序的后续所有平行节点标签
    • .previous_siblings   迭代类型,返回按照html文本顺序的前续所有平行节点标签

     总结如下图:

     

    bs4库的prettify()方法--让HTML内容更加“友好”的显示

     

     

    信息提取

    Beautiful Soup库提供了<>.find_all()函数,返回一个列表类型,存储查找的结果。

    详细介绍如下:

      <>.find_all(name, attrs, recursive, string,**kwargs)

      <tag>(...) == <tag>.find_all(...)

      soup(...) == soup.find_all(...)

    • name :  对标签名称的检索字符串
    • attrs:    对标签属性值的检索字符串,可标注属性检索
    • recursive :  是否对子孙全部检索,默认 True
    • string :        <>...</>中字符串区域的检索字符串
    >>> soup.find_all('p',target='_blank')     #查找p标签,而且属性值是_blank的  
    []   
    >>> soup.find_all(id='su')          #查找id属性值是su的标签  
    [<input class="bg s_btn" id="su" type="submit" value="百度一下"/>] 
    
  • 相关阅读:
    <转载> diff 和 patch 命令
    JZ2440开发板之LCD
    发音篇--第一章
    JZ2440开发板之系统始终和串口
    【还是用回csdn了,这个blog就不更新了】
    MyBatis 汉字作为查询条件查询不到 MySQL 中的结果
    LeetCode 617. 合并二叉树 Merge Two Binary Tree
    LeetCode 454. 四数相加 II 4Sum II
    LeetCode 441. 排列硬币 Arranging Coins
    leetcode ——从排序数组中删除重复项 II
  • 原文地址:https://www.cnblogs.com/P3nguin/p/7532410.html
Copyright © 2011-2022 走看看