• BeautifulSoup4 提取数据爬虫用法详解


    Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。 
    它基于 HTML DOM 的,会载入整个文档,解析整个 DOM树,因此时间和内存开销都会
    大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python
    标准库中的HTML解析器,也支持 lxml 的 XML解析器。虽然说BeautifulSoup4 简单容易比较上手,但是匹配效率还是远远不如正则以及xpath的,一般不推荐使用,推荐正则的使用。

    第一步:pip install beautifulsoup4 ,万事开头难,先安装 beautifulsoup4,安装成功后就完成了第一步。

    第二步:导入from bs4 import BeautifulSoup 这个模块

    第三步:创建 Beautiful Soup 对象          soup = BeautifulSoup(html) 

    开始使用:

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

    (1)用BeautifulSoup来获取Tags :Tag 通俗点讲就是 HTML 中的一个个标签,直接用BeautifulSoup来调用

    soup = BeautifulSoup(html,’lxml’)
    print(soup.title)
    print(soup.head)
    print(soup.a)
    print(soup.p)
    print(type(soup.p))
    这样就可以得到你想要的标签内容了。

    tag还可以进行增删改查的操作:

    #soup 对象本身比较特殊,它的 name 即为 [document]
    print(soup.name)
    print(soup.head.name)
    #把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。
    print(soup.p.attrs)
    #根据名称获取对应的属性值,类型为列表
    print(soup.p['class'])
    print(soup.p.get('class'))
    # 可以对这些属性和内容等等进行修改
    soup.p['class'] = "newClass"
    print(soup.p)
    # 删除属性
    del soup.p['class']
    print(soup.p)
    (2)  NavigableString 

    获取标签内部的文字用 .string 即可

    print(soup.p.string)
    # The Dormouse's story

    print(type(soup.p.string))
    # In [13]: <class 'bs4.element.NavigableString'
    (3)   BeautifulSoup

    BeautifulSoup 对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag对象,是
    一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性

    print(type(soup.name))
    # <type 'unicode'>
    print(soup.name)
    # [document]
    print(soup.attrs)
    # 文档本身的属性为空 # {}
    (4) Comment

    Comment对象是一个特殊类型的NavigableString 对象,其输出注释但不包含注释符号。 

    print(soup.a)
    # <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>

    print(soup.a.string)
    # Elsie


    print(type(soup.a.string))
    # <class 'bs4.element.Comment'>
    a 标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容时,注释符号已经去掉了 

    一      开始搜索文档树:.find_all(name, attrs, recursive, text, **kwargs) 

    1)name 参数 
    name 参数可以查找所有名字为 name 的 tag,字符串对象会被自动忽略掉 
    A.传字符串 
    Beautiful Soup会查找与字符串完整匹配的内容 
    范例:用于查找文档中所有的<b>标签: 
    print(soup.find_all('b')) print(soup.find_all('a')) 
    B.传正则表达式 
    Beautiful Soup会通过正则表达式的 match()来匹配内容. 
    范例:找出所有以 b开头的标签,这表示<body>和<b>标签都应该被找到 
    import re for tag in soup.find_all(re.compile("^b")):     print(tag.name) 
    C.传列表 
    Beautiful Soup会将与列表中任一元素匹配的内容返回. 
    范例:找到文档中所有<a>标签和<b>标签: 
    print(soup.find_all(["a", "b"])) 
    2)keyword 参数 
    print(soup.find_all(id='link2')) 
    3)text 参数 
    text 参数接受字符串,正则表达式,列表, 可以搜搜文档中的字符串内容 
    print(soup.find_all(text="Elsie")) 
    print(soup.find_all(text=["Tillie", "Elsie", "Lacie"])) 
    print(soup.find_all(text=re.compile("Dormouse"))) 

    二 CSS选择器      (重点!!!!!!)

    写 CSS时,标签名不加任何修饰,类名前加.,id名前加# 
    可以利用类似的 soup.select()方法来筛选元素,返回结果是 list 
    soup.select_one() 返回值是list的首个。 
    (1)通过标签名查找 
    print(soup.select('title'))  print(soup.select('a')) print(soup.select('b')) 
    (2)通过类名查找 
    print(soup.select('.sister')) 
    (3)通过 id 名查找 
    print(soup.select('#link1')) 
    (4)组合查找 
    组合查找即和写 class文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 
    p 标签中,id 等于 link1的内容,二者需要用空格分开 
    print(soup.select('p #link1')) 直接子标签查找,则使用 > 分隔 
    print(soup.select("head > title")) 
    (5)属性查找 
    查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,
    所以中间不能加空格,否则会无法匹配到。 
    print(soup.select('a[class="sister"]')) 
    print(soup.select('a[href="http://example.com/elsie"]')) 
    同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加
    空格 
    print(soup.select('p a[href="http://example.com/elsie"]')) 
    (6)获取内容 
    可以遍历 select 方法返回的结果,然后用 get_text() 方法来获取它的内容。 
    soup = BeautifulSoup(html, 'lxml') 
    print(type(soup.select('title'))) 
    print(soup.select('title')[0].get_text()) 
    for title in soup.select('title'):     
    print(title.get_text()) 

    学会以上这些,基本就可以自己掌握BeautifulSoup4的使用了
    ————————————————
    版权声明:本文为CSDN博主「赶在日落之前」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lzz781699880/article/details/81209038

  • 相关阅读:
    全面理解javascript的caller,callee,call,apply概念(修改版)
    动态显示更多信息(toggle_visible函数的运用)
    再论call和apply
    RSS News Module的应用
    准备制作一套全新的DNN皮肤(包括个人定制或企业级定制)
    ControlPanel研究系列二:简单Ajax模式的ControlPanel(SimplAjax)
    New_Skin发布了....
    如何定制dnn的FckEditor
    Blog已迁移到dnnsun.com(最新DotNetNuke咨询平台)
    新DNN皮肤的经验及成果分享
  • 原文地址:https://www.cnblogs.com/valorchang/p/11468171.html
Copyright © 2020-2023  润新知