xpath的基础使用

一.xpath简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

`节点

  在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。

xpath比美丽汤更通用,在各语言的xpath中都可以使用,scrapy框架也是内置了一个xpath,而美丽汤只能在python中使用.

二、xpath语法

  1.选取节点

表达式

描述

实例

 

nodename

选取nodename节点的所有子节点

xpath('//div')

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

/

从根节点选取

xpath('/div')

从根节点上选取div节点

//

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

xpath('//div')

选取所有的div节点

.

选取当前节点

xpath('./div')

选取当前节点下的div节点

..

选取当前节点的父节点

xpath('..')

回到上一个节点

@

选取属性

xpath('//@calss')

选取所有的class属性

  2、谓语

     谓语被嵌在方括号内,用来查找某个特定的节点或包含某个特定的值的节点,因为所有xpath解析返回值为一个列表

    xpath的索引从1开始   

表达式

结果

xpath('/body/div[1]')

选取body下的第一个div节点

xpath('/body/div[last()]')

选取body下最后一个div节点

xpath('/body/div[last()-1]')

选取body下倒数第二个div节点

xpath('/body/div[positon()<3]')

选取body下前两个div节点

xpath('/body/div[@class]')

选取body下带有class属性的div节点

xpath('/body/div[@class="main"]')

选取body下class属性为main的div节点

xpath('/body/div[price>35.00]')

选取body下price元素值大于35的div节点

  3、通配符  

    Xpath通过通配符来选取未知的XML元素

表达式

结果

xpath('/div/*')

选取div下的所有子节点

xpath('/div[@*]')

选取所有带属性的div节点

    4、取多个路径 

    使用“|”运算符可以选取多个路径

    

表达式

结果

xpath('//div|//table')

选取所有的div和table节点

  5、Xpath轴

    轴可以定义相对于当前节点的节点集

轴名称

表达式

描述

ancestor

xpath('./ancestor::*')

选取当前节点的所有先辈节点(父、祖父)

ancestor-or-self

xpath('./ancestor-or-self::*')

选取当前节点的所有先辈节点以及节点本身

attribute

xpath('./attribute::*')

选取当前节点的所有属性

child

xpath('./child::*')

返回当前节点的所有子节点

descendant

xpath('./descendant::*')

返回当前节点的所有后代节点(子节点、孙节点)

following

xpath('./following::*')

选取文档中当前节点结束标签后的所有节点

following-sibing

xpath('./following-sibling::*')

选取当前节点之后的兄弟节点

parent

xpath('./parent::*')

选取当前节点的父节点

preceding

xpath('./preceding::*')

选取文档中当前节点开始标签前的

  

preceding-sibling

xpath('./preceding-sibling::*')

选取当前节点之前的兄弟节点

self

xpath('./self::*')

选取当前节点

   6、功能函数 

      使用功能函数能够更好的进行模糊搜索

函数

用法

解释

starts-with

xpath('//div[starts-with(@id,"ma")]')

选取id值以ma开头的div节点

contains

xpath('//div[contains(@id,"ma")]')

选取id值包含ma的div节点

and

xpath('//div[contains(@id,"ma") and contains(@id,"in")]')

选取id值包含ma和in的div节点

text()

xpath('//div[contains(text(),"ma")]')

选取节点文本包含ma的div节点

    

    

三.使用流程

xpath数据解析流程:
  1.pip install lxml
  2.导包:from lxml import etree
  3.实例化一个etree对象(将页面数据加载到该对象)

    •  本地文件:tree = etree.parse(文件名)          tree.xpath("xpath表达式")  ===>本地文件指的是包打开的网页另存为到本地的文件
    •   网络数据:tree = etree.HTML(网页内容字符串)       tree.xpath("xpath表达式")    

  4.调用etree中的xpath函数结合着xpath表达式进行数据解析操作

   看一个例子(爬取58)

import requests
from lxml import etree

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'
}
url='https://sz.58.com/ershoufang/?PGTID=0d200001-0000-4229-cd25-6936558931c6&ClickID=1'
#拿到页面源码数据的text
page_text=requests.get(url=url,headers=headers).text
#把页面源码数据作为参数实例一个etree对象
tree=etree.HTML(page_text)

#用xpath进行解析
#xpath表达式的作用:xpath表达式如果作用到页面源码中,可以将页面源码中指定的标签进行定位.
#所有xpath解析返回值为一个列表
#可以对局部对象在进行xpath,但是路径要记得要变成./
li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')

f=open('./xpath-58.txt','w',encoding='utf-8')
for li in li_list:
    title=li.xpath('./div[2]/h2/a/text()')[0]#xpath返回的是一个列表,即使解析对象只有一个
    total_price=li.xpath('./div[3]/p[1]//text()')#返回两个值直接返回
    total_price=''.join(total_price)

    f.write(title+':'+total_price+'\n')
f.close()

#这边只爬取了第一页,如想要爬取其他页面,只要去改一下页码参数,进行一个循环即可

猜你喜欢

转载自www.cnblogs.com/tjp40922/p/10433427.html