数据分析xpath

1. xpath安装与使用

1. 安装

安装lxml库

或者:

  pip install lxml  -i pip源

pip可以百度搜一下
 

 2. 解析流程与使用

解析流程:

 实例化一个etree的对象,把即将被解析的页面源码加载到该对象

 调用该对象的xpath方法结合着不同形式的xpath表达进行标签定位和数据提取

xpath 的使用

 导入lxml.etree

  from lxml import etree

 etree.parse()

  解析本地html文件

html_tree = etree.parse('XX.html')

etree.HTML()(建议)

  解析网络的html字符串


html_tree = etree.HTML(html字符串)
res = html_tree.xpath('') # 匹配的东西

一般我会这样用会比较方便:

from lxml import etree
# 实例化tree对象
tree = etree.HTML(open('./豆瓣.html', 'r', encoding='UTF-8').read())
res = tree.xpath('')
# 节点对象转换成字符串输出
print(etree.tostring(res[1],encoding='UTF-8').decode('UTF-8'))

  使用xpath路径查询信息,返回一个列表

注意:如果lxml解析本地HTML文件报错可以安装如下添加参数

parser = etree.HTMLParser(encoding="utf-8")

selector = etree.parse('./sey_1.html',parser=parser)

result=etree.tostring(selector)

3. xpath语法

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

1. 路径表达式

  | 表达式  | 描述            |

  | :--- | :---------------------------- |

  | /    | 从根节点选取。    |

  | //   | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |

  | ./   | 当前节点再次进行xpath        |

  | @    | 选取属性。          |

  实例:

  在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

  | 路径表达式               | 结果                                       |

  | :------------------ | :--------------------------------------- |

  | /html               | 选取根元素。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |

  | //a               | 选取所有a元素,而不管它们在文档中的位置。                 |

  | //ul//li            | 选择属于 ul元素的后代的所有 li元素,而不管它们位于 ul之下的什么位置。  |

  | 节点对象.xpath('./div') | 选择当前节点对象里面的第一个div节点                      |

  | //@src            | 选取名为 src 的所有属性。                         |

2. 谓语(Predicates)

  谓语用来查找某个特定的节点或者包含某个指定的值的节点。

  谓语被嵌在方括号中。

实例:

  在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

  | 路径表达式                              | 结果                                       |

  | :--------------------------------- | :--------------------------------------- |

  | /ul/li[1]                          | 选取属于 ul子元素的第一个 li元素。                     |  

  | /ul/li[last()]                     | 选取属于 ul子元素的最后一个 li元素。                    |

  | /ul/li[last()-1]                   | 选取属于 ul子元素的倒数第二个 li元素。                   |

  | //ul/li[position()<3]              | 选取最前面的两个属于 ul元素的子元素的 li元素。               |

  | //a[@title]                        | 选取所有拥有名为 title的属性的 a元素。                  |

  | //a[@title='xx']                   | 选取所有 a元素,且这些元素拥有值为 xx的 title属性。          |

  | //a[@title>10]   `> < >= <= !=`    | 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。  |

  | /bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |

3. 选取未知节点

  XPath 通配符可用来选取未知的 XML 元素。

  | 通配符    | 描述                              |

  | :----- | :------------------------------ |

  | *      | 匹配任何元素节点。  一般用于浏览器copy xpath会出现 |

  | @*     | 匹配任何属性节点。                       |

  | node() | 匹配任何类型的节点。                      |

  实例:

  在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

  | 路径表达式       | 结果                  |

  | :---------- | :------------------ |

  | /ul/*       | 选取 ul元素的所有子元素。      |

  | //*         | 选取文档中的所有元素。         |

  | //title[@*] | 选取所有带有属性的 title 元素。 |

  | //node()    | 获取所有节点              |

4. 选取若干路径

 1.  通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

 实例:

  在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

  | 路径表达式                            | 结果                                       |

  | :------------------------------- | :--------------------------------------- |

  | //book/title | //book/price     | 选取 book 元素的所有 title 和 price 元素。          |

  | //title | //price               | 选取文档中的所有 title 和 price 元素。               |

  | /bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |

2. 逻辑运算

  - 查找所有id属性等于head并且class属性等于s_down的div标签

//div[@id="head" and @class="s_down"]

  - 选取文档中的所有 title 和 a 元素。

from lxml import etree
# 网站内容
tree = etree.HTML(open('./豆瓣.html', 'r', encoding='UTF-8').read())
# 获取文档中所有 title和 a 元素

res = tree.xpath('//title | //a')

    注意: “|”两边必须是完整的xpath路径

 3. 属性查询

  1. 查找所有包含id属性的div节点

//div[@id]

  2. 查找所有id属性等于maincontent的div标签

//div[@id="maincontent"]

  3. 查找所有的class属性

//@class

  4.  //@Name

//li[@name="xx"]//text()  # 获取li标签name为xx的里面的文本内容

5. 获取第几个标签  索引从1开始

  tree.xpath('//li[1]/a/text()')  # 获取第一个

  tree.xpath('//li[last()]/a/text()')  # 获取最后一个

  tree.xpath('//li[last()-1]/a/text()')  # 获取倒数第二个

4. 模糊查询

   1. 查询所有id属性中包含fix的div标签

//div[contains(@id, "fix")]

  2. 查询所有id属性中包以he开头的div标签

   

//div[starts-with(@id, "fix")]

 3. 内容查询

  查找所有div标签下的直接子节点h1的内容

//div/h1/text()

4. 属性值获取

//div/a/@href   获取a里面的href属性值

5. 获取所有
 

//*  #获取所有

//*[@class="xx"]  #获取所有class为xx的标签

6.  获取节点内容转换成字符串
 

c = tree.xpath('//li/a')[0]

result=etree.tostring(c, encoding='utf-8')

print(result.decode('UTF-8'))

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小田爱犯困.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值