xpath简介和基本使用

1. xpath简介

  • xpath使用路径表达式在xml和html中进行导航,可用来在html和xml文档中对元素和属性进行遍历。
  • xpath包含标准函数库
  • xpath是一个w3c的标准

2. 基础术语极其解释

  • xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

    • 元素: 被<>包住的节点称之为元素
    • 属性: 元素中id='bk104', xxx称之为属性
  • 操作符或表达式

    操作符或表达式 含义
    / 从根节点开始查找
    // 从当前节点开始任意层内查找
    . 当前节点
    .. 当前节点的父节点
    @ 选择属性
    节点名 在html节点下选取所有这个节点名的节点
    * 匹配任意元素节点
    @* 匹配任意属性的节点
    node() 匹配任意类型的节点
    text() 匹配text类型的节点
  • xpath轴(Axes)

    轴名称 结果
    ancestor 选取当前节点的所有先辈(父、祖父等)
    ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
    attribute 选取当前节点的所有属性。@id 等价于 attribute::id
    child 选取当前节点的所有子元素。title 等价于 child:title
    descendant 选取当前节点的所有后代元素(子、孙等)
    descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
    following 选取文档中当前节点的结束标签之后的所有节点
    namespace 选取当前节点的所有命名空间节点
    parent 选取当前节点的父节点
    preceding 直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点
    preceding-sibling 选取当前节点之前的所有同级节点
    self 选取当前节点。 . 等价于 self::node()

    3.xpath常用实例

    以/开始是绝对路径,表示从根开始
    不以/开始是相对路径,一般动当前节点来计算.当前节点在上下文环境中,不一定是根目录.
    一般如果搜索层次很深,推荐使用//来查找

    路径表达式 含义
    title 选取当前节点下的所有title子节点
    /book 从根节点找子节点是book的,一般找不到,根节点下只有html
    book/title 当前节点下的所有book子节点下的title节点
    //title 从根节点向下找任意层中的title节点
    book//title 当前节点下的book节点下的任何层中找titles
    //@name 任意层下查找name属性,取回的是属性而不是节点
    //book[@id] 任意层中寻找有id属性的book节点
    //book[@id='bk104'] 任意层中寻找id属性为bk101的book节点
    /bookstore/book[1]/@id 根节点bookstore下第一个book节点的id属性
    /bookstore/book[last()-1] 根节点bookstore下的倒数第二个book节点
    /bookstore/* 根节点bookstore下的所有子节点,不递归
    //* 匹配所有节点
    //[@] 匹配所有有属性的节点
    //book[@*] 匹配所有有属性的book节点
    //@* 匹配所有属性
    //book/title` `//price 匹配所有book下的title节点或者任意层下的price节点
    //book[position()=2] 匹配所有book节点中的第二个
    //book[position()<last()-1] 匹配所有book节点中位置小于倒数第二个的
    //book[price>40] 匹配其下的price节点值大于40的book节点
    //book[2]/node() 匹配第二个book节点下的所有类型的节点
    //book[1]/text() 匹配第一个book节点下的所有的文本
    //book[1]//text() 匹配第一个book节点下的任意层的子节点的文本
    //*[local-name()='book'] 匹配所有不戴限定名节点名称为book的所有节点

    4.配合lxml使用xpath

    lxml是Python功能丰富的xml,html解析库,性能非常好,是对libxml2和libxslt的封装
    centos编译安装需要依赖libxml2-devel和libxslt-devel
    不同平台请参考http://lxml.de/installation.html
    安装:
    pip install lxml
    简单使用方法:

    from lxml impot etree
    import requests
    
    response = requests.get(url, headers={'User-agent':ua})
    content = response.text
    html = etree.HTML(content)
    titles = html.xpath('//div[@id='bk104']//tr//td/text()') # 返回文本列表
    

5. 在scrapy中使用xpath

直接使用response.xpath('//div[@id="bk104"]')返回的是一个scrapy的selector对象,可以进一步调用xpath继续选择.
瑞国要返回doom节点元素,可以调用extract()返回的是一个列表.
如果只需要列表的第一个或者列表长度本身为1,可以用extract_first()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • XPath 语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path)...
    迷路了吗_67f1阅读 548评论 0 0
  • XPath 语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (p...
    Stranger_I阅读 500评论 0 0
  • xpath的作用就是两个字“定位”, 运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:fi...
    心悦飞飞阅读 2,311评论 0 0
  • XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,而将...
    哈耶卡卡阅读 4,882评论 0 1
  • ···lxml用法源自 lxml python 官方文档,更多内容请直接参阅官方文档,本文对其进行翻译与整理。lx...
    小丰丰_72a2阅读 938评论 0 1