精华内容
下载资源
问答
  • 2020-11-29 13:50:33
    更多相关内容
  • Python 基础 之 lxml 下载、xpath使用规则的详细说明、综合使用 推荐xpath 学习网站:https://www.w3school.com.cn/xpath/xpath_functions.asp   目录 Python 基础 之 lxml 下载、xpath使用规则的详细...

    Python 基础 之 lxml 下载、xpath使用规则的详细说明、综合使用

    推荐xpath 学习网站:https://www.w3school.com.cn/xpath/xpath_functions.asp

     

    目录

    Python 基础 之 lxml 下载、xpath使用规则的详细说明、综合使用

    一、简单介绍

    二、lxml 的安装(xpath 安装库)

    三、XPath常用规则

    1、选取节点,常用的路径表达式:

    2、XPath 表达式中的运算符

    3、XPath 轴(通过XPath获取祖先节点,属性值,兄弟节点等等,这就是XPath的节点轴。轴可定义相对于当前节点的节点集。)

    四、基本操作

    0、参照的 html 内容示例(一段不完整的html)

    1、lxml 补全功能:把上端HTML中的节点没有闭合,我们可以使用lxml中的etree模块进行补全

    2、直接读取解析保存的html

    3、获取所有节点:获取 html 中所有的节点

    4、如果我们不要获取所有节点而是指定获取某个名称的节点,只需要将*改为指定节点名称即可。如获取所有的li节点

    5、获取子节点:根据Xpath的常用规则我们可以使用/或//获取子孙节点或子节点,现在我要获取li节点下的a节点

    6、获取文本信息:使用text()方法获取节点中的文本。现在获取所有a标签的文本信息

    7、获取属性信息:可以通过@匹配指定的属性。我们通过class属性找最后一个li节点

    8、获取父节点:可以通过..获取当前节点的父节点。现在我要获取第二个a节点的父节点下的class属性

    9、contains()函数:contains()匹配一个属性值中包含的字符串,匹配获取

    10、多属性匹配:很多情况下无法仅仅根据一个属性值就获取到目标节点,往往要根据多个属性来获取目标节点

    11、XPath 表达式中的运算符的使用:获取列表中的信息

    12、XPath 轴的使用:获取对应信息

    五、Xpath 插件

    六、参考内容


     

    一、简单介绍

    Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。 起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。[来自360百科] 现在我们使用它对HTML文档进行搜索。
     

    二、lxml 的安装(xpath 安装库)

    1、使用 pip install lxml (新版本的python 3.x 好像已经集成了该功能的库)

     

     

    三、XPath常用规则

    1、选取节点,常用的路径表达式:

    表达式

    描述

    实例

     

    nodename

    选取nodename节点的所有子节点

    xpath(‘//div’)

    选取了div节点的所有子节点

    /

    从根节点选取

    xpath(‘/div’)

    从根节点上选取div节点

    //

    选取所有的当前节点,不考虑他们的位置

    xpath(‘//div’)

    选取所有的div节点

    .

    选取当前节点

    xpath(‘./div’)

    选取当前节点下的div节点

    ..

    选取当前节点的父节点

    xpath(‘..’)

    回到上一个节点

    @

    选取属性

    xpath(’//@calss’)

    选取所有的class属性

     

    2、XPath 表达式中的运算符

    运算符描述实例返回值
    |计算两个节点集//book | //cd返回所有拥有 book 和 cd 元素的节点集
    +加法6 + 410
    -减法6 - 42
    *乘法6 * 424
    div除法8 div 42
    =等于price=9.80

    如果 price 是 9.80,则返回 true。

    如果 price 是 9.90,则返回 false。

    !=不等于price!=9.80

    如果 price 是 9.90,则返回 true。

    如果 price 是 9.80,则返回 false。

    <小于price<9.80

    如果 price 是 9.00,则返回 true。

    如果 price 是 9.90,则返回 false。

    <=小于或等于price<=9.80

    如果 price 是 9.00,则返回 true。

    如果 price 是 9.90,则返回 false。

    >大于price>9.80

    如果 price 是 9.90,则返回 true。

    如果 price 是 9.80,则返回 false。

    >=大于或等于price>=9.80

    如果 price 是 9.90,则返回 true。

    如果 price 是 9.70,则返回 false。

    orprice=9.80 or price=9.70

    如果 price 是 9.80,则返回 true。

    如果 price 是 9.50,则返回 false。

    andprice>9.00 and price<9.90

    如果 price 是 9.80,则返回 true。

    如果 price 是 8.50,则返回 false。

    mod计算除法的余数5 mod 21

     

    3、XPath 轴(通过XPath获取祖先节点,属性值,兄弟节点等等,这就是XPath的节点轴。轴可定义相对于当前节点的节点集。)

    轴名称结果
    ancestor选取当前节点的所有先辈(父、祖父等)。
    ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
    attribute选取当前节点的所有属性。
    child选取当前节点的所有子元素。
    descendant选取当前节点的所有后代元素(子、孙等)。
    descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
    following选取文档中当前节点的结束标签之后的所有节点。
    namespace选取当前节点的所有命名空间节点。
    parent选取当前节点的父节点。
    preceding选取文档中当前节点的开始标签之前的所有节点。
    preceding-sibling选取当前节点之前的所有同级节点。
    self选取当前节点。

     

     

     

    四、基本操作

    0、参照的 html 内容示例(一段不完整的html)

    <div>
        <ul>
            <li class="item-0"><a href="www.baidu.com">baidu</a>
            <li class="item-1"><a href="https://blog.csdn.net/qq_25343557">myblog</a>
            <li class="item-2"><a href="https://www.csdn.net/">csdn</a>
            <li class="item-3"><a href="https://hao.360.cn/?a1004">hao123</a>
    

    1、lxml 补全功能:把上端HTML中的节点没有闭合,我们可以使用lxml中的etree模块进行补全

    from lxml import etree
    
    content = '''
    <div>
        <ul>
            <li class="item-0"><a href="www.taobao.com">taobao</a>
            <li class="spitem-1"><a href="https://www.csdn.net/">csdn</a>
            <li class="item-2"><a href="https://hao.360.cn">hao123</a>
            <li class="item-3"><a href="https://www.baidu.com">baidu</a>        
    '''
    html = etree.HTML(content)
    result = etree.tostring(html).decode("utf-8")
    print(result)

     

    运行结果(闭合了节点、还补全了标签):

     

    2、直接读取解析保存的html

    from lxml import etree
    
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    

     

    运行结果(正确读取到了保存的html):

     

    3、获取所有节点:获取 html 中所有的节点

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    
    # '//' 表示获取当前节点的子孙节点,'*'表示所有节点, '//*'表示获取当前节点下所有节点
    result = html.xpath("//*")
    for item in result:
        print(item)
    

    运行结果:

     

    4、如果我们不要获取所有节点而是指定获取某个名称的节点,只需要将*改为指定节点名称即可。如获取所有的li节点

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点, '//li'表示获取当前节点下所有li节点
    result = html.xpath("//li")
    for item in result:
        print(item)
    

    运行结果:

     

    5、获取子节点:根据Xpath的常用规则我们可以使用/或//获取子孙节点或子节点,现在我要获取li节点下的a节点

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点, 'a'表示a节点
    # '//li/a'表示获取当前节点下所有li节点下的a节点
    result = html.xpath("//li/a")
    for item in result:
        print(item)
    

    运行结果:

    (注意:我们也可以使用//ul//a首先选择所有的ul节点,再获取ul节点下的的所有a节点,最后结果也是一样的。但是使用//ul/a就不行了,首先选择所有的ul节点,再获取ul节点下的直接子节点a,然而ul节点下没有直接子节点a,当然获取不到。需要深刻理解//和/的不同之处。/用于获取直接子节点,//用于获取子孙节点。)

     

    6、获取文本信息:使用text()方法获取节点中的文本。现在获取所有a标签的文本信息

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点, 'a'表示a节点,text() 内容
    # '//li/a'表示获取当前节点下所有li节点下的a节点的text内容
    result = html.xpath("//li/a/text()")
    for item in result:
        print(item)
    

    运行结果:

     

    7、获取属性信息:可以通过@匹配指定的属性。我们通过class属性找最后一个li节点

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点,[@class='item-3'] 表示属性 class='item-3' 
    # "//li[@class='item-3']"表示获取当前节点下属性为 class='item-3' 的li节点
    result = html.xpath("//li[@class='item-3']")
    for item in result:
        print(item)
    

    运行结果:

     

    8、获取父节点:可以通过..获取当前节点的父节点。现在我要获取第二个a节点的父节点下的class属性

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'a'表示a节点,@href='https://www.csdn.net/'表示属性,
    # @class 表示属性
    # "//a[@href='https://www.csdn.net/']/../@class"表示获取当前节点下所有属性为@href='https://www.csdn.net/'
    # 的a节点下的a节点的父节点的class属性
    result = html.xpath("//a[@href='https://www.csdn.net/']/../@class")
    for item in result:
        print(item)
    

    运行结果:

     

    9、contains()函数:contains()匹配一个属性值中包含的字符串,匹配获取

    from lxml import etree
    html = etree.parse("./TestHtml.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点,contains(@class,'sp') 表示属性包含sp字段的class
    # //li[contains(@class,'sp')]" 表示获取当前节点下所有class属性包含'sp'字段的li节点
    result = html.xpath("//li[contains(@class,'sp')]")
    for item in result:
        print(item)
    

    运行结果:

    注意:第二个li节点的class属性有两个值:sp和item-1。如果我们的xpath匹配规则为//li[@class="sp"]匹配的仅仅是class属性值只为spli节点,这显然是不存在的

     

    10、多属性匹配:很多情况下无法仅仅根据一个属性值就获取到目标节点,往往要根据多个属性来获取目标节点

    from lxml import etree
    html = etree.parse("./TestHtml_2.html", etree.HTMLParser())
    result = etree.tostring(html)
    print(result.decode("utf-8"))
    # '//' 表示获取当前节点的子孙节点,'li'表示li节点,contains(@class,'sp') 表示属性包含sp字段的class
    # @name='xan' 表示为 'xan' 的 name 属性
    # "//li[contains(@class,'sp') and @name='xan']/a/text()" 表示获取当前节点下所有class属性包含'sp'字段qi
    # 且 name属性为'xan'的li节点下的 a 节点的text内容
    result = html.xpath("//li[contains(@class,'sp') and @name='xan']/a/text()")
    print(result)
    

    运行结果:

     

    11、XPath 表达式中的运算符的使用:获取列表中的信息

    from lxml import etree
    content = '''
    <div>
        <ul>
            <li class="item-0"><a href="www.taobao.com">taobao</a>
            <li class="spitem-1"><a href="https://www.csdn.net/">csdn</a>
            <li class="item-2"><a href="https://hao.360.cn">hao123</a>
            <li class="item-3"><a href="https://www.baidu.com">baidu</a>        
    '''
    html = etree.HTML(content)
    
    result = html.xpath("//li[2]/a/text()")     # 获取li列表 第二个节点a的内容
    print(result)
    result = html.xpath("//li[last()]/a/text()")        # 获取li列表 最后一个节点a的内容
    print(result)
    result = html.xpath("//li[last()-1]/a/text()")      # 获取li列表 倒数第二个节点a的内容
    print(result)
    result = html.xpath("//li[position()<=3]/a/text()")     # 获取li列表 前三个节点a的内容
    print(result)
    

    运行结果:

     

    以上使用了last()和postion()函数,在XPath中还有很多函数,详情见:w3school 函数

     

    12、XPath 轴的使用:获取对应信息

    from lxml import etree
    
    content = '''
    <div>
        <ul>
            <li class="item-0"><a href="www.taobao.com">taobao</a>
            <li class="spitem-1"><a href="https://www.csdn.net/">csdn</a>
            <li class="item-2"><a href="https://hao.360.cn">hao123</a>
            <li class="item-3"><a href="https://www.baidu.com">baidu</a>        
    '''
    html = etree.HTML(content)
    
    result = html.xpath('//li[1]/ancestor::*')  # ancestor表示选取当前节点祖先节点,*表示所有节点。合:选择当前节点的所有祖先节点。
    print(result)
    result = html.xpath('//li[1]/ancestor::div')  # ancestor表示选取当前节点祖先节点,div表示div节点。合:选择当前节点的div祖先节点。
    print(result)
    result = html.xpath('//li[1]/ancestor-or-self::*')  # ancestor-or-self表示选取当前节点及祖先节点,*表示所有节点。合:选择当前节点的所有祖先节点及本及本身。
    print(result)
    result = html.xpath('//li[1]/attribute::*')  # attribute表示选取当前节点的所有属性,*表示所有节点。合:选择当前节点的所有属性。
    print(result)
    result = html.xpath('//li[1]/attribute::name')  # attribute表示选取当前节点的所有属性,name表示name属性。合:选择当前节点的name属性值。
    print(result)
    result = html.xpath('//ul/child::*')  # child表示选取当前节点的所有直接子元素,*表示所有节点。合:选择ul节点的所有直接子节点。
    print(result)
    result = html.xpath(
        '//ul/child::li[@name="two"]')  # child表示选取当前节点的所有直接子元素,li[@name="two"]表示name属性值为two的li节点。合:选择ul节点的所有name属性值为two的li节点。
    print(result)
    result = html.xpath('//ul/descendant::*')  # descendant表示选取当前节点的所有后代元素(子、孙等),*表示所有节点。合:选择ul节点的所有子节点。
    print(result)
    result = html.xpath(
        '//ul/descendant::a/text()')  # descendant表示选取当前节点的所有后代元素(子、孙等),a/test()表示a节点的文本内容。合:选择ul节点的所有a节点的文本内容。
    print(result)
    result = html.xpath('//li[1]/following::*')  # following表示选取文档中当前节点的结束标签之后的所有节点。,*表示所有节点。合:选择第一个li节点后的所有节点。
    print(result)
    result = html.xpath('//li[1]/following-sibling::*')  # following-sibling表示选取当前节点之后的所有同级节点。,*表示所有节点。合:选择第一个li节点后的所有同级节点。
    print(result)
    result = html.xpath('//li[1]/parent::*')  # 选取当前节点的父节点。父节点只有一个,祖先节点可能多个。
    print(result)
    result = html.xpath(
        '//li[3]/preceding::*')  # preceding表示选取文档中当前节点的开始标签之前的所有同级节点及同级节点下的节点。,*表示所有节点。合:选择第三个li节点前的所有同级节点及同级节点下的子节点。
    print(result)
    result = html.xpath('//li[3]/preceding-sibling::*')  # preceding-sibling表示选取当前节点之前的所有同级节点。,*表示所有节点。合:选择第三个li节点前的所有同级节点。
    print(result)
    result = html.xpath('//li[3]/self::*')  # 选取当前节点。
    print(result)
    

    运行结果:

     

    五、Xpath 插件

    不想写XPath的匹配规则,在真正的网页解析中怎么可能那么短的规则。这时候我们就可以使用Chrome的插件XPath Helper了【下载地址】,使用它我们可以很快速的得到匹配规则。直接将下载下来的crx文件拖进Chrome扩展程序界面安装即可。

    (好像有问题,待解。。。)

    1、xpath helper  2、xpath checker

    六、参考内容

    https://blog.csdn.net/qq_25343557/article/details/81912992

     

    展开全文
  • termux 的lxml下载

    2021-11-09 09:37:01
    下载失败图

    下载失败图请添加图片描述

    展开全文
  • lxml-3.6.4-cp35-cp35m-win32.whl 安装进入所在目录,执行...解决:下载并安装lxml的whl,成功。这里要注意,选择对应版本,一般是win32,而不选win_arm64,即使电脑是win64。如果选win64版本,会失败,提示平台错误。
  • lxml-lxml-3.3.zip

    2021-05-19 15:54:49
    lxml3.3安装包
  • python之lxml安装包

    2015-12-30 21:14:13
    lxml-3.4.4-cp27-none-win_amd64.whl 适用于python27 适用于win8.1 64bit 不可用于win10 64bit 先安装pip install wheel 再执行:pip install lxml-3.4.4-cp27-none-win_amd64.whl
  • python3.4里面要下载插件怎么知道知道要下载哪个版本的,例如python3.4要下载lxml.
  • 使用国内资源下载列如豆瓣。 方法: 进入CMD

    一、 第一次下载lxml时是在Pychar上下载失败。

    最后找到原因,pip版本需要升级.
    

    二、 然后去搜索大量信息资源发现自己无法更新。

    最后发现失败原因:下载超时
    

    三、搜索更新超时解决办法->

    使用国内资源下载、例如豆瓣。
    方法: 进入CMD 运行如下代码

    pip install lxml -i https://pypi.douban.com/simple/
    

    详细参考:
    pip更新超时解决方案

    四、pip更新完毕—>

    五、下载lxml 失败

    原因和pip更新一样下载超时
    方法:进入CMD

    pip install lxml -i https://pypi.douban.com/simple/
    

    详见参考:
    安装超时解决方案
    五、2021年4.25号此方法能够解决这些问题。

    展开全文
  • 本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快。 本次爬取的豆瓣书籍排行榜的首页地址是: https://www.douban.com/doulist/1264675/?start=0&sort=time&playable=0&sub_type= 该排行榜一共...
  • windows离线安装lxml

    2022-04-06 17:34:45
    引言:一般如果主机能够正常上网,则直接pip install lxml即可安装使用lxml库。但由于种种原因,需要使用离线的方法安装lxml库,本文介绍简单快捷的离线安装python lxml库的方法 关于lxmllxml是一个HTML/XML的...
  • pycharm下载lxml失败的解决办法

    千次阅读 2020-02-10 21:11:27
    pycharm通过pip install lxml安装时,每次都出现timeout错误,最后通过cmd -》pip install lxml在python的site-packages下找到了库,然后拷到了pycharm目录下的site-packages里,就可以运行了 ...
  • 命令行直接输入pip3 install lxml,进行下载 这个下载速度非常慢,中途可能会失败,但是可能我人品好,没啥问题,一次成功了。如果出现不能成功下载的情况,不要心慌,下面就是解决办法啦! 下载2 1)查看电脑的...
  • lxml

    2019-04-04 01:31:32
    NULL 博文链接:https://ssdutliuhaibo.iteye.com/blog/1500298
  • lxml-4.6.2版本下载

    2021-01-13 10:49:00
    lxml-4.6.2版本下载
  • python lxml使用文档

    2019-04-14 08:18:27
    美国新墨西哥理工大学的官方教程,详细说明了如何利用python lxml模块进行xml进行解析 比lxml官方教程更清晰易懂,共56页
  • python_lxml

    2017-08-14 08:12:40
    python_lxml
  • lxml安装包

    2017-02-08 16:32:43
    lxml.exe安装包
  • No module named ‘lxml

    2021-01-31 10:51:29
    pycharm无法调用lxml,需要把lxml下载并安装在python文件夹内; 1.下载lxml文件,官网下载!{http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml} 注意要下载自己python和系统对应的版本(例:python3.8 64-bit下载...
  • python模块: lxml

    2017-06-23 14:18:42
    包含:libxml2-2.9.4.tar.gz libxslt-1.1.28.tar.gz lxml-3.8.0.tar.gz 步骤参考: 1)tar -zxvf libxml2-2.9.4.tar.gz cd libxml2-2.9.4 ./configure --prefix=/usr/local/libxml2/ --with-python=/usr/local/...
  • Python pip安装lxml出错的问题解决办法1. 在使用pip安装lxml过程中出现了一下错误:>>> pip install lxmlC:\Users\Chen>pip install lxmlCollecting lxmlUsing cached lxml-3.5.0.tar.gzInstalling ...
  • Python3爬虫利器之lxml解析库的安装

    千次阅读 2021-04-26 21:39:29
    本节中,我们了解一下lxml的安装方式,这主要从Windows、Linux和Mac三大平台来介绍。1. 相关链接官方网站:http://lxml.deGitHub:https://github.com/lxml/lxmlPyPI:https://pypi.python.org/pypi/lx...
  • lxml 模块 没有etree 的解决

    千次阅读 2022-01-01 22:45:23
    lxml下载网址附上 成功解决,不同的调用方式,注意我后面的HTML()是手打上去的,运行后没有报错说明是可以的 我一直鼓捣为什么调用不出来HTML(),是浪费很多时间 from lxml import etree test = '''''' abc...
  • 运行cmd 命令安装 pip install lxml 不能安装 更新pip 到最新版本 先卸载pip, cmd运行 pip uninstall 重新安装python以后 pip更新到最新版本 lxml通过lxml的.whl文件来进行安装。https://www.lfd.uci.edu/~...
  • lxml的轮子,python36,爬虫必须并,如果pip下载保存可以下轮子
  • 资源来自pypi官网。 资源全名:lxml-3.7.3-cp27-cp27m-win32.whl
  • For Lxml、twisted: cp37对应py3.7,自行选择32 or 64位。没有3.7就用3.6 安装时,运行cmd,输入pip install + 文件路径 即可 ex: pip install C:\Users\name\Downloads\Twisted-18.7.0-cp37-cp37m-win_amd64.whl ...
  • 先 pip uninstall lxml 卸载模块 ,下载压缩包, 然后去找到C:\Program Files\Anaconda3\Lib\site-packages 模块路径,解压就可以了
  • 需要先安装lxml,然后再安装beautifulsoup4,一次性成功,很稳 1、pip install lxml 2、pip install beautifulsoup4
  • PyCharm手动安装第三方库lxml

    万次阅读 2021-03-20 14:16:58
    去这里https://github.com/lxml/lxml下载lxml的安装包 压缩包解压,解压完后找到该文件夹(注意层级) 2、将lxml文件夹copy到python的目录下(%appPath%/python3\Lib) 注意目录是src下面的lxml 3、...
  • lxml详解.rar

    2020-09-03 20:45:34
    第一章 XML基础速成 第二章 彻底掌握python中的lxml (一) 第三章 彻底掌握python中的lxml (二) lxml封装 ... 代码及讲解非常全面

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,876
精华内容 10,350
关键字:

lxml下载