美文网首页
63.2-lxml爬取口碑榜和bs4基本概念

63.2-lxml爬取口碑榜和bs4基本概念

作者: BeautifulSoulpy | 来源:发表于2020-08-28 17:36 被阅读0次

    别让生活的压力挤走我们快乐不管昨天发生了什么,不管昨天的自己有多难堪,有多无奈,有多苦涩,都过去了,不会再来,也无法更改!


    总结:

    1. 推荐使用lxml作为解析器,效率高。 手动指定解析器;

    3. lxml

    lxml 是Python下功能丰富的XML、HTML解析库, 性能非常好, 是对libxml 2和libxslt的封装。
    最新版支持Python 2.6+, python 3支持到3.6。

    安装
    CentOS编译安装需要
    yum install libxml 2-devel libxslt-devel
    注意,不同平台不一样,参看http://lxml.de/installation.html
    Ixml安装
    $pip install lxml

    from lxml import etree
    
    # 使用etree构建HTML
    root = etree.Element('html')
    print(type(root))
    print(root.tag)
    
    body = etree.Element('body')
    root.append(body)
    print(etree.tostring(root))
    print('--------------------------------')
    sub = etree.SubElement(body, 'child1') # 增加子节点
    print(type(sub))
    print('--------------------------------')
    sub = etree.SubElement(body, 'child2').append(etree.Element('child21'))
    print(etree.tostring(root, pretty_print=True).decode())
    #--------------------------------------------------------------------
    <class 'lxml.etree._Element'>
    html
    b'<html><body/></html>'
    --------------------------------
    <class 'lxml.etree._Element'>
    --------------------------------
    <html>
      <body>
        <child1/>
        <child2>
          <child21/>
        </child2>
      </body>
    </html>
    

    etree还提供了2个有用的函数
    etree.HTML(text)解析HTML文档,返回根节点
    anode.xpath('xpath路径') 对节点使用xpath语法

    安装插件XPath Helper 豆瓣电影口碑榜单
    1. 练习:爬取“口碑榜”

    从豆瓣电影中提取“本周口碑榜”

    import requests
    from lxml import etree
    
    # ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"
    url = "https://movie.douban.com/"
    
    req = requests.request('GET',url,headers={'User-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"})
    
    if req:
        html = req.text   # 分析的 HTML
        # print(text[:800])
    
        root = etree.HTML(html)  # 分析HTML,返回DOM根节点;
        titles = root.xpath('//div[@class="billboard-bd"]//a/text()')  # 匹配文本,返回列表
        print(titles)
    #-----------------------------------------------
    ['少年邦', '欢迎来到车臣', '寅次郎的故事:欢迎归来', '索莱', '八佰', '最好的还未到来', '影里', '春江水暖', '耳光', '夏日国度']
    

    4. Beautiful Soup 4**

    Beautiful Soup可以从HTML、XML中提取数据。目前BS 4在持续开发
    官方中文文档
    https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

    安装
    $pip install beautifulsoup4
    导入
    from bs 4 import BeautifulSoup

    初始化
    BeautifulSoup(markup="", features=None)
    markup,被解析对象,可以是文件对象或者html字符串
    features指定解析器 ,返回一个文档对象

    4.1 解析器
    安装解析器

    Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:

    $ apt-get install Python-lxml
    $ easy_install lxml
    $ pip install lxml
    
    $ apt-get install Python-html5lib
    $ easy_install html5lib
    $ pip install html5lib
    
    常用解析器比较

    可以不指定解析器,就依赖系统已经安装的解析器库了。

    解析器 使用方法 优势 劣势
    Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库执行速度适中文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
    lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快文档容错能力强 需要安装C语言库
    lxml XML 解析器 BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") 速度快唯一支持XML的解析器 需要安装C语言库
    html5lib BeautifulSoup(markup, "html5lib") 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 速度慢

    BeautifulSoup(markup, "html.parser") 使用Python标准库,容错差且性能一般。
    BeautifulSoup(markup, "lxml") 容错能力强,速度快。需要安装系统C库。
    推荐使用lxml作为解析器,效率高。
    请手动指定解析器,以保证代码在所有运行环境中解析器一致。

    使用下面内容构建test.html使用bs4解析它

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
    <h1>马哥教育欢迎您</h1>
    <div id="main">
        <h3 class="title highlight"><a href="http://www.python.org">python</a>高级班</h3>
        <div class="content">
            <p id='first'>字典</p>
            <p id='second'>列表</p>
            <input type="hidden" name="_csrf" value="7139e401481ef2f46ce98b22af4f4bed">
            <!-- comment -->
            <img id="bg1" src="http://www.magedu.com/">
            <img id="bg2" src="http://httpbin.org/">
        </div>
    </div>
    <p>bottom</p>
    </body>
    </html>
    
    4.2 四种对象

    BeautifulSoup将HTML文档解析成复杂的树型结构,每个节点都是Python的对象,可分为4种:
    BeautifulSoup、Tag、NavigableString、Comment

    BeautifulSoup对象

    BeautifulSoup对象代表整个文档。

    Tag对象

    它对应着HTML中的标签。有2个常用的属性:

    1. name:Tag对象的名称,就是标签名称 如 soup.p,p标签;
    2. attrs:标签的属性字典,返回值为字典
      属性 可以被修改、删除
      多值属性 对于class属性可能是下面的形式, <h3 class="title highlight">python高级班</h3> ,这
      个属性就是多值({'class': ['title', 'highlight']})
    from bs4 import BeautifulSoup
    
    with open('./test.html',encoding='utf-8') as f:
        soup = BeautifulSoup(f,'lxml')
        print(soup.builder)  # 解析器
        print('------------------------------')
        print(soup.p,type(soup.p))   # 第一行 匹配值(深度优先,一直往里面钻)
        print(soup.p.attrs,type(soup.p.attrs))   # 输出为字典
        print(soup.h3.attrs)
        print('------------------------------')
        print(type(soup.div))
        print(soup.div.div)
        print('------------------------------')
        print(soup.div.get('id'))     # 类似与字典的 提取;
        print(soup.div.attrs['id'])
        print(soup.div.div.get('class'))
        print(soup.div.attrs.get('class','1001'))   # 为默认值;
        print('------------------------------')
        print(soup.img.get('src'))
        soup.img['src'] = '123'    # 替换
        print(soup.img.get('src'))
        print(soup.a)    # 找不到返回None ;
    #------------------------------------------------------------------------------------------------------------------------------
    C:\ProgramData\Miniconda3\envs\blog\python.exe C:/Users/dell/PycharmProjects/spiders/t2.py
    <bs4.builder._lxml.LXMLTreeBuilder object at 0x0000026C5B7CAB70>
    ------------------------------
    <p id="first">字典</p> <class 'bs4.element.Tag'>
    {'id': 'first'} <class 'dict'>
    {'class': ['title', 'highlight']}
    ------------------------------
    <class 'bs4.element.Tag'>
    <div class="content">
    <p id="first">字典</p>
    <p id="second">列表</p>
    <input name="_csrf" type="hidden" value="7139e401481ef2f46ce98b22af4f4bed"/>
    <!-- comment -->
    <img id="bg1" src="http://www.magedu.com/"/>
    <img id="bg2" src="http://httpbin.org/"/>
    </div>
    ------------------------------
    main
    main
    ['content']
    1001
    ------------------------------
    http://www.magedu.com/
    123
    <a href="http://www.python.org">python</a>
    

    注意,我们一般不使用上面这种方式来操作HTML,此代码是为了熟悉对象类型

    NavigableString

    读取文本信息
    如果只想输出标记内的文本,而不关心标记的话,就要使用NavigableString。

        print(soup.div.p.string) # 第一个div下第一个p的字符串
        print(soup.p.string) # 同上
    #------------------------------------------------
    字典
    字典
    
    注释对象

    这就是HTML中的注释,它被BeautifulSoup解析后对应Comment对象。

    相关文章

      网友评论

          本文标题:63.2-lxml爬取口碑榜和bs4基本概念

          本文链接:https://www.haomeiwen.com/subject/wsplsktx.html