精华内容
下载资源
问答
  • lxml库

    2020-03-13 12:49:52
    lxml库 什么是lxml库 lxml是一种使用Python编写的库,可以迅速、灵活地处理XML 支持XPath语句 学习lxml库的目的 利用所学的XPath语法,来快速定位特定元素以及节点信息 目的是提取HTML、XML目标数据 安装lxml库 ...

    lxml库

    什么是lxml库

    lxml是一种使用Python编写的库,可以迅速、灵活地处理XML

    支持XPath语句

    学习lxml库的目的

    利用所学的XPath语法,来快速定位特定元素以及节点信息

    目的是提取HTML、XML目标数据

    安装lxml库

    pip install lxml

    详情代码学习,见如下:

    # 导入lxml库, 调用etree方法
    from lxml import etree
    
    # 准备的html数据,不完整    html,body,li标签不完整
    html_data = '''
    <div>
      <ul>
           <li class="item-0"><a href="link1.html">first item</a></li>
           <li class="item-1"><a href="link2.html">second item</a></li>
           <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
           <li class="item-1"><a href="link4.html">fourth item</a></li>
           <li class="item-0"><a href="link5.html">fifth item</a>
       </ul>
    </div>
    '''
    # 使用etree.HTML,获取html数据
    html = etree.HTML(html_data)
    # 使用etree.tostring()方法将html转成文本字符串并进行转义
    print(etree.tostring(html).decode())    # 输出带有html、body、li标签的完整html语句
    
    # 返回 _Element类型对象   它所指的就是整个xml树的根节点
    print(type(html))       # 输出:<class 'lxml.etree._Element'>
    
    # 后面就可以使用XPath语句来获取html中的元素(省略...)
    
    展开全文
  • Python爬虫入门之初遇lxml库

    万次阅读 多人点赞 2020-12-19 00:42:15
    Python爬虫入门之初遇lxml库 爬虫是什么 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。 爬虫...

    Python爬虫入门之初遇lxml库

    1.爬虫是什么

    所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。

    2.爬虫三要素

    • 抓取
    • 分析
    • 存储

    3.爬虫的过程分析

    当人类去访问一个网页时,是如何进行的?
      ①打开浏览器,输入要访问的网址,发起请求。
      ②等待服务器返回数据,通过浏览器加载网页。
      ③从网页中找到自己需要的数据(文本、图片、文件等等)。
      ④保存自己需要的数据。

    对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
      首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。
      其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。
      最后,对于上面的④步骤,我们要利用python实现保存数据的功能。
      因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

    4.如何用python请求一个网页

    作为一门拥有丰富类库的编程语言,利用python请求网页完全不在话下。这里推荐一个非常好用的类库urllib.request。

    如何模拟用户请求请看我的另一篇博客:https://laoniu.blog.csdn.net/article/details/111472608

    4.1.抓取网页

    • urllib.request库使用
    import urllib.request
    
    response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')
    print(response.read().decode('utf-8'))

    这样就可以抓取csdn我的主页的html文档

    我们使用爬虫就是需要在网页中提取我们需要的数据,接下来我们来学习抓取一下百度搜索页的热榜数据

    4.2.如何解析网页呢

    使用lxml库

    lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML 和 HTML。

    它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的 ElementTree API。

    安装

    • 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

    环境/版本一览:

    • 开发工具:PyCharm 2020.2.3
    • python:3.8.5

    4.3.编写代码

    import urllib.request
    from lxml import etree
    
    # 获取百度热榜
    url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
    # 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
    req = urllib.request.Request(url=url, headers={
        'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    })
    # 发起请求
    html_resp = urllib.request.urlopen(req).read().decode("utf-8")

    到这里我们可以顺利获取百度的搜索页面html文档

    我门需要看一下热搜排行榜的标签元素在哪里

    找到第一条  右键复制 XPath   (后边说XPath是什么)

    我们需要了解并使用XPath,XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    复制的内容结果是://*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]

    这xPath字符串 表示现在在html定位的位置就是热点新闻第一行内容

    5.XPath常用规则

    表达式 描述
    nodename 选取此节点的所有子节点
    / 从当前节点选取直接子节点
    // 从当前节点选取子孙节点
    . 选取当前节点
    .. 选取当前节点的父节点
    @ 选取属性
    * 通配符,选择所有元素节点与元素名
    @* 选取所有属性
    [@attrib] 选取具有给定属性的所有元素
    [@attrib='value'] 选取给定属性具有给定值的所有元素
    [tag] 选取所有具有指定元素的直接子节点
    [tag='text'] 选取所有具有指定元素并且文本内容是text节点

    6.继续分析

    那么我们要获取所有的热点新闻该怎么写呢

    继续看网页

    可以看到所有的热榜分别在三个<tbody>之下

    修改一下刚才复制的XPath

    //*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1] 改为  //*[@id="con-ar"]/div[2]/div/div/table/tbody/tr

    这样XPath就会定位到这三个tbody下的所有tr元素内容

    我们继续看一下tr是不是我们想要的内容,展开一个tr看看

    淦~还有一堆,百度你不讲武德,,

    “马保国”经典语录 年轻人不讲武得 耗子为之

    这该怎么办。我们需要拿到数据是 【标题】 【访问链接】 【热度】,现在手里已经拿到的是所有的tr元素

    紧接着从tr下手 直接 拿到下面所有<a>标签的标题与超链接

    标题的XPath: */a/@title 超链接的XPath: */a/@href

    *表示匹配tr下的所有元素  /a是在*找到第一个a标签  @是属性选择器 titlehref就是要选择的素属性了

    还剩下个热度,let‘s me 继续操作,直接选择tr下的第二个td  XPath: td[2]

    分析完毕,把完整的代码贴出来

    import urllib.request
    from lxml import etree
    
    # 获取百度热榜
    
    url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
    # 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
    req = urllib.request.Request(url=url, headers={
            'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        })
    html_resp = urllib.request.urlopen(req).read().decode("utf-8")
    html = etree.HTML(html_resp)#初始化生成一个XPath解析对象
    _list = html.xpath("//*[@id='con-ar']/div[2]/div/div/table/tbody/tr")
    print(f"article count : {len(_list)}")
    
    for tr in _list:
        title = tr.xpath("*/a/@title")[0]  # 获取url的title
        href = tr.xpath("*/a/@href")[0] # 获取url的href
        hot = tr.xpath("string(td[2])").strip() # 获取热度
        print(f"{hot}\t{title}\thttps://www.baidu.com{href}")
    

    点击运行,程序啪就跑起来了,很快啊,数据全都过来了,我全都接住了,我笑了一下。希望百度耗子为之

    到此就完成了lxml xpath的基本使用,更详细的xpath教程请看 :https://www.w3school.com.cn/xpath/index.asp

    7.存储数据

    紧接着存储数据,修改一下代码

    print(f"article count : {len(_list)}")
    
    with open('g_data.text', 'w') as f:  # 在当前路径下,以写的方式打开一个名为'g_data.text',如果不存在则创建
        for tr in _list:
            title = tr.xpath("*/a/@title")[0]  # 获取url的title
            href = tr.xpath("*/a/@href")[0]  # 获取url的href
            hot = tr.xpath("string(td[2])").strip()  # 获取热度
            line = f"{hot}\t{title}\thttps://www.baidu.com{href}\n"
            f.write(line)  # 写入文件

    8.补充

    东西虽然不多,但是也是写了挺长时间,算是对自己学习的一个总结,也希望能够帮助大家,我也只是个菜鸟,文中错误的地方可以直接指出来

    展开全文
  • 主要介绍了Python大数据之使用lxml库解析html网页文件,结合实例形式分析了Python大数据操作中使用lxml库解析html网页具体步骤及相关注意事项,需要的朋友可以参考下
  • PyCharm安装lxml库

    千次阅读 2019-08-14 14:42:36
    二、下载lxml库 https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml ①“lxml‑4.2.1”:为LXML版本号 ②“cp37‑cp37m”:为对应的python版本号,如本人安装的python版本号为Python 3.6.2,则应选择“cp36‑cp36m...

    一、在DOS输入python查看版本号
    二、下载lxml库

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

    ①“lxml‑4.2.1”:为LXML版本号

    ②“cp37‑cp37m”:为对应的python版本号,如本人安装的python版本号为Python 3.6.2,则应选择“cp36‑cp36m”

    ③“win32”:为对应的python版本位数,非电脑的操作系统位数

    三、更新pip

    python -m pip install --upgrade pip

    四、安装wheel

    pip install wheel

    四、安装下载的lxml库

    pip install lxml-4.3.5-cp37-cp37m-win32.whl

    五、安装完成重启PyCharm

    展开全文
  • python爬虫教程:lxml库

    2021-02-08 12:37:11
    python爬虫教程:lxml库 一、前言: ​ hello,大家好,我是小白菜。今天为大家带来的是爬虫教程的第二部分lxml库的讲解。我还记得我最初学习爬虫的时候,只知道一个bs4库,除此之外什么都不知道。后来接触到了lxml...

    python爬虫教程:lxml库

    一、前言:

    ​ hello,大家好,我是小白菜。今天为大家带来的是爬虫教程的第二部分lxml库的讲解。我还记得我最初学习爬虫的时候,只知道一个bs4库,除此之外什么都不知道。后来接触到了lxml库,才发现这个库真的还挺好用的。好的,下面开始为大家讲解一下lxml库的基本使用。

    二、lxml库的基本使用:

    1.lxml库简介:

    ​ lxml库是python的第三方库,安装方式也是十分简单,这里就不多赘述。而lxml库的特点就是简单和易上手,并且解析大型文档(特指xml或html文档)的速度也是比较快的,因此写爬虫解析网页的时候它也是我们的一个不错的选择。

    2.初始化:

    ​ 使用lxml库的第一个步骤永远是初始化,只有初始化之后我们才可以去使用它的语法。

    ​ 初始化方法如下:

    ​ html = etree.HTML(text)

    1>参数:

    text : html内容的字符串

    2>返回值:

    html : 一个lxml库的对象

    示例:

    from lxml import etree		#我们主要使用的lxml库中的etree库
    text = '''
    <body>
        <div class="key">
            <div class="iocnBox"><i class="iconfont icon-delete"></i></div>
            <div class="empty">清空</div>
            <textarea placeholder="在此述说新年寄语..." rows="1" class="van-field__control"></textarea>
            <div class="buts">发送</div>
        </div>
    '''
    #开始初始化
    html = etree.HTML(text)		#这里需要传入一个html形式的字符串
    

    3.xpath(lxml)语法讲解:

    ​ 也许你会惊讶,说我们不是在讲解lxml库吗?为什么这里写的是xpath语法?好吧,其实我忘记说了,lxml库的语法就是基于xpath语法来的,所以会了xpath语法,自然就会了lxml语法。

    ​ 而且观察返回的结果,发现大部分返回的都是以列表的形式返回的结果,这一点请注意。

    1>语法1:寻找节点
    语法 含义
    nodename(节点名字) 直接根据写的节点名字查找节点,如:div
    // 在当前节点下的子孙节点中寻找,如://div
    / 在当前节点下的子节点中寻找,如:/div
    . 代表当前节点(可省略不写,就像我们有时候写的相对路径),如:./div
    当前节点的父节点,如:…/div

    示例1—子孙节点:

    from lxml import etree
    
    text = '''
    <body>
        <div>这时测试的div</div>
        <div>
            <div>
                这是嵌套的div标签
                <p>
                    这时嵌套的p标签
                </p>
            </div>
        </div>
        <p>这时测试的p</p>
    </body>
    '''
    
    html = etree.HTML(text)
    result = html.xpath('//div')	#使用xpath语法,一是在子孙节点中寻找,二是寻找div的标签
    print(result)
    #结果:
    #[<Element div at 0x1e4cadbf608>, <Element div at 0x1e4cae512c8>, <Element div at 0x1e4cae51348>]
    

    首先,说明下lxml如何使用xpath语法:

    ​ 使用方法就是对初始化的对象调用xpath(str)方法即可,这里参数为传入的xpath语法字符串。

    其次,分析下上面的代码:

    ​ 首先,我们初始化一个html对象,然后调用在此基础上调用xpath语法,其中传入的参数为: //div,意思是寻找其中的div标签。然后我们观察text字符串中的html代码,可以看见,里面总共只有三个div标签,符合结果。(div标签是成对出现,一组为:

    示例2—子节点:

    from lxml import etree
    
    text = '''
    <body>
        <div>这时测试的div</div>
        <div>
            <div>
                这是嵌套的div标签
                <p>
                    这时嵌套的p标签
                </p>
            </div>
        </div>
        <p>这时测试的p</p>
    </body>
    '''
    
    html = etree.HTML(text)
    result = html.xpath('/html/body/div')
    print(result)
    #结果:
    #[<Element div at 0x1ea38b7f4c8>, <Element div at 0x1ea38c11188>]
    

    首先,说明下lxml库的一个功能:补全与完善功能。

    ​ 即我们传入的html代码不是标准的html代码,因为标准的html代码结构如下。

    #标准结构
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    	<!--主题代码 -->
    </body>
    </html>
    

    ​ 虽然我们传入的不是完整结构,但是lxml会在一定程度上完善我们的html代码,尽量使它变为标准的结构。那么如何查看这个事实呢?只需要调用etree.tostring(html)结果。如下

    from lxml import etree
    
    text = '''
    <body>
        <div>这时测试的div</div>
        <div>
            <div>
                这是嵌套的div标签
                <p>
                    这时嵌套的p标签
                </p>
            </div>
        </div>
        <p>这时测试的p</p>
    </body>
    '''
    
    html = etree.HTML(text)
    result = etree.tostring(html)
    print(result)
    #结果如下,中文没有正常显示,但是结构是正确的
    '''
    <html><body>
        <div>&#36825;&#26102;&#27979;&#35797;&#30340;div</div>
        <div>
            <div>
                &#36825;&#26159;&#23884;&#22871;&#30340;div&#26631;&#31614;
                <p>
                    &#36825;&#26102;&#23884;&#22871;&#30340;p&#26631;&#31614;
                </p>
            </div>
        </div>
        <p>&#36825;&#26102;&#27979;&#35797;&#30340;p</p>
    </body>
    </html>
    '''
    

    其次,分析下代码的结果。我们这里传入的xpath语法为: /html/body/div 。这样我们首先获取了html标签。在获取的了html标签内的body标签,而属于body内的子节点的div总共有两个。故结果打印两个标签。

    2>语法2:筛选

    ​ 有时候单纯的选择还不够,因为我们有时候需要的信息只在某一种标签中的某一个标签中,如一个网页中有很多的div标签,但是只有拥有class="hello"的属性的标签才具有我们需要的信息。因此,掌握一些筛选的方法是必须的事情。

    重要说明:

    ​ 当我们使用筛选时,筛选的方法都是包含在[](中括号)中的。

    方法集合一:属性筛选

    方法名\符号 作用
    @ 获取属性或者筛选属性,如:@class
    contains 判断属性中是否含有某个值(用于多值判断),如:contains(@class,‘hello’)

    ​ 属性筛选示例:

    from lxml import etree
    
    text = '''
    <div class="hello">
        <p>Hello,this is used to tested</p>
    </div>
    <div class="hello test hi">
        <div>
            <div>你好,这是用于测试的html代码</div>
        </div>
    </div>
    
    <div class="button">
        <div class="menu">
            <input name="btn" type="button" value="按钮" />
        <div>
    </div>
    '''
    
    #初始化
    html = etree.HTML(text)
    #根据单一属性筛选
    
    #筛选出class="hello"的div标签
    hello_tag = html.xpath('//div[@class="hello"]')		#注意筛选的方法都是在中括号里面的
    print(hello_tag)	#结果为: [<Element div at 0x2ba41e6d088>],即找到了一个标签,符合条件
    
    #找出具有name="btn"的input标签
    input_tag = html.xpath('//input[@name="btn"]')
    print(input_tag)	#结果为:[<Element input at 0x1751d29df08>],找到一个input标签,符合条件
    
    #筛选出具有class="hello"的div标签
    hello_tags = html.xpath('//div[contains(@class,"hello")]')
    print(hello_tags)	#结果为:[<Element div at 0x1348272d248>, <Element div at 0x1348272d6c8>],即找到了两个div标签,符合条件
    

    方法集合二:按序选择

    ​ 有时候我们会有这样的需求,我们爬取的内容是一个table标签(表格标签),或者一个ul(标签),了解过html的应该都知道这样的标签,内部还有很多标签,比如table标签里就有tr、td等,ul里面就有li标签等。对于这样的标签,我们有时候需要选择第一个或者最后一个或者前几个等。这样的方式我们也可以实现。

    方法 作用
    last() 获取最后一个标签
    1 获取第一个标签
    position() < = > num 筛选多个标签(具体见实例)

    ​ 按序选择示例:

    这里需要注意这里的序是从1开始而不是从0开始

    from lxml import etree
    
    text = '''
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>     
    '''
    
    #初始化
    html = etree.HTML(text)
    
    #获取第一个li标签
    first_tag = html.xpath('//li[1]')	#令人吃惊,lxml并没有first()方法
    print(first_tag)
    
    #获取最后一个li标签
    last_tag = html.xpath('//li[last()]')
    print(last_tag)
    
    #获取前五个标签
    li_tags = html.xpath('//li[position() < 6]')
    print(li_tags)
    

    方法集合三:逻辑和计算

    ​ 其实在写筛选时是可以加入逻辑方法的,如:and、or、>、>=等。当然也是可以写入一些计算方法的,如:+、-等。

    ​ 下面给出示例:

    from lxml import etree
    
    text = '''
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>     
    '''
    
    #初始化
    html = etree.HTML(text)
    
    #获取第二个li标签,使用=判断
    second_tag = html.xpath('//li[position() = 2]')
    print(second_tag)
    
    #获取第一个和第二个标签,使用or
    tags = html.xpath('//li[position() = 1 or position() = 2]')
    print(tags)
    
    #获取前三个标签,使用<
    three_tags = html.xpath('//li[position()<4]')
    print(three_tags)
    

    ​ 其余的方法使用思路都是一样的。会了一个其余的按照思路写即可。

    3>语法3:获取属性和文本

    ​ 好的,终于到这一步了(写得太累了,_)。我们寻找标签、筛选标签的最终目的就是获取它的属性或者文本内容。下面讲解获取文本和属性的方法。

    方法 作用
    @ 获取属性或者筛选属性
    text() 获取文本

    ​ 获取文本示例:

    from lxml import etree
    
    text = '''
    <div class="hello">
        <p>Hello,this is used to tested</p>
    </div>
    <div class="hello test hi">
        <div>
            <div>你好,这是用于测试的html代码</div>
        </div>
    </div>
    
    <div class="button">
        <div class="menu">
            <input name="btn" type="button" value="按钮" />
        <div>
    </div>
    '''
    
    #初始化
    html = etree.HTML(text)
    
    #获取第一个div中的p标签中的文本
    content = html.xpath('//div/p/text()')    #注意使用text()的时机和位置
    print(content)  #结果为:['Hello,this is used to tested'],仍然是以列表形式返回结果
    
    #获取拥有第二个div中的文本,注意观察下面的不同之处
    content_two = html.xpath('//div[position() = 2]/text()')
    print(content_two)  #结果为: ['\n    ', '\n']
    
    content_three = html.xpath('//div[position() = 2]//text()')
    print(content_three)  #结果为: ['\n    ', '\n        ', '你好,这是用于测试的html代码', '\n    ', '\n']
    #两者不同之处在于:一个为//,一个为/。我们知道//获取其子孙节点中的内容,而/只获取其子节点的内容。
    

    ​ 获取属性示例:

    from lxml import etree
    
    text = '''
    <div class="hello" name="test">
        <p>Hello,this is used to tested</p>
    </div>
    <div class="hello test hi">
        <div>
            <div>你好,这是用于测试的html代码</div>
        </div>
    </div>
    
    <div class="button">
        <div class="menu">
            <input name="btn" type="button" value="按钮" />
        <div>
    </div>
    '''
    
    #初始化
    html = etree.HTML(text)
    
    #获取第一个div的name属性
    first_div_class = html.xpath('//div[@class="hello"]/@name')
    print(first_div_class)  #结果为:['test']
    
    #获取input标签的name值
    input_tag_class = html.xpath('//input/@name')
    print(input_tag_class) #结果为:['btn']
    

    三、总结:

    ​ 好的,lxml库的讲解差不多就到此为止了,至于更多的方法还是推荐查官方文档。因为有些方法确实不常用。谢谢大家!

    展开全文
  • Lxml库是基于lbxml2的XML解析库的Python封装。作用:使用Xpath语法解析定位网页数据。LXMl库的安装与使用方法Lxml库的安装windows系统下的安装:#pip安装pip3 install lxml#wheel安装#下载对应系统版本的wheel文件:...
  • python导入lxml库

    千次阅读 2017-07-03 15:27:59
    先去这里下载一个lxml的库文件,我本地的python版本是python2.7,因此下载的lxml库版本是lxml-2.3-py2.7-win-amd64.egg(注意64位和32位)。 导入lxml库之前需要先装好pip,前提是已经装好了python,直接安装python...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,435
精华内容 9,374
关键字:

lxml库