zoukankan      html  css  js  c++  java
  • Python爬虫之Lxml库与Xpath语法

    Lxml库是基于lbxml2的XML解析库的Python封装。

    作用:使用Xpath语法解析定位网页数据。

    LXMl库的安装与使用方法

    Lxml库的安装

    windows系统下的安装:
    复制代码
    #pip安装
    pip3 install lxml
    
    #wheel安装
    #下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
    pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl
    复制代码
    linux下安装:
    yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
    
    pip3 install lxml
     
     

     Lxml库使用

    修正HTML代码

    Lxml为XML的解析库,很好的支持了HTML文档的解析功能。

    from lxml import etree
    text="""
    one
    """
    html1=etree.HTML(text)
    print(html1)

    etree库把HTML文档解析为Element对象,可以通过以下代码输出解析过的HTML文档

    from lxml import etree
    text="""
    one
    """
    html1=etree.HTML(text)
    print(html1)
    result=etree.tostring(html1)
    print(result)

    通过运行程序我们可以看出,Lxml库自动补全了HTML代码。

     
    读取HTML文件

    通过PyCharm新建一个.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>flower</title>
    </head>
    <body>
    one
    </body>
    </html>
    from lxml import etree
    html1=etree.parse('flower.html')
    result=etree.tostring(html1,pretty_print=True)
    print(result)
    解析HTML文件
    import requests
    from lxml import etree
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'
    }
    res=requests.get('https://book.douban.com/',headers=headers)
    html=etree.HTML(res.text)
    result=etree.tostring(html)
    print(result)

    Xpath语法

    节点关系

    父节点

    每个元素及其属性都有一个父节点,例如

    <user>
         <name>xiao ming</name>
         <sex>JK. Rowling</sex>
         <id>34</id>
         <goal>89</goal>
    </user>

    其中user元素为name,sex,id,goal元素的父节点

    子节点

    元素节点可有0个,一个,或者多个自节点,在上述例子中name,sex,id,goal为user的子节点。

    同胞节点

    name,sex,id,goal互为同胞节点,即同胞节点有相同的父亲节点

    先辈节点

    先辈节点为某元素的父节点和父节点的父节点

    后代节点

    某节点的子节点和子节点的子节点

    节点选择

    Xpath使用路径表达式在XML文档中选取节点,节点是通过沿着路径或者step来选取的

    使用技巧

     

    import requests
    from lxml import etree
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
    }
    #//*[@id="content"]/div/div[1]/div[1]/div[2]/div/div/ul[2]/li[1]/div[1]/a/img
    res=requests.get('https://book.douban.com',headers=headers)
    selector=etree.HTML(res.text)
    img=selector.xpath('//*[@id="content"]/div/div[1]/div[4]/div[2]/ul/li[1]/div[2]/h4/a/text()')[0]
    print(img)

    通过/text()获取标签内的文字信息

  • 相关阅读:
    composer 自动加载 通过classmap自动架子啊
    composer 自动加载一 通过file加载
    call_user_func函数
    array_filter与array_map
    array_filter、array_walk、array_map的区别
    array_filter函数
    基于visual Studio2013解决算法导论之012计数排序
    基于visual Studio2013解决算法导论之011快排改良
    基于visual Studio2013解决算法导论之010快排中应用插入排序
    基于visual Studio2013解决算法导论之009快速排序随机版本
  • 原文地址:https://www.cnblogs.com/gaochunhui/p/11700630.html
Copyright © 2011-2022 走看看