• chrome浏览器安装Xpath Helper插件


    最近偷空研究了一下python,准备用python写一个爬虫。

    在使用scrapy,爬取网页信息时,我需要去定位节点,所以也就有了下面这篇文章。

    例子代码:

     1 import scrapy
     2 from tutorial.items import DemozItem
     3 
     4 class DmozSpider(scrapy.Spider):
     5     name = "dmoz"
     6     allowed_domains = ["dmoz.org"]
     7     start_urls = [
     8         "file:///D:/pyscrapy/tutorial/tutorial/spiders/test.html"
     9     ]
    10     def parse(self, response):
    11         #将爬取的数据以Item对象的形式返回
    12         for sel in response.xpath("//p/a[@name='链接']"):
    13             #item = DemozItem()
    14             list = sel.xpath('text()').extract()
    15             if len(list) != 0:
    16                 print(list[0].replace(' ', ''))

    从例子代码中可以看到xpath()方法中的参数为xpath路径表达式。我要去写我所需要信息的xpath,才能抓取到我需要的信息,所以书写xpath表达式是必然的。当然你也可以直接在chrome浏览器中按F12,在你所要选择的元素上右键-Copy-Copy XPath,但是这样获取的xpath一般可能不够准确。所以,最好还是学习一下XPath语法。

    在探索中我找到了一个可以很方便查找xpath表达式的插件,由于我是chrome浏览器所以安装这个插件网上很多介绍,你可以去这里下载并了解这个插件:在这里 这里面讲解很详细包括安装和使用。

    XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。(W3School 中有一些用法)

    实例1:获取name为“现病史”结点父节点的父节点(p):【可以看到表达式锁定的p颜色为标记为了黄色。】

    //span[1]/a[@name='现病史']/parent::node()[1]/parent::node()

    实例2:获取子节点(child::node()[1]代表取子节点的第一个,如果不写则是取所有):

    //td/p/child:node()

    可以看到一共匹配了376个结果,当前是第九个满足匹配的节点。

    实例3:获取文本内容为 “手术外伤史” 的同级标签:

    //p[span="手术外伤史:"]/child::node()

    实例4:获取p标签,p的子节点的文本中包含  ”婚姻史“ 或者 “婚育史” 

    .//p[contains(.,'婚姻史')]| .//p[contains(.,'婚育史')]

    图1:

    图2:

    实例5:获取子标签文本中包含 “初步诊断” 文本的tbody标签:

    .//tbody[tr[td[p[contains(.,'初步诊断')]]]]

    实例6:【某x标签后的第一个y标签】获取“辅助检查“所在p标签后的第一个table标签:

    .//p[contains(.,'辅助检查')]/following-sibling::table[1]

    实例7:【下一个兄弟节点】获取子节点中某name属性值为”体格检查“的p标签的下一个兄弟节点:

    .//p[span[a[@name="体格检查"]]]/following-sibling::*[1]

    XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:

    1、child 选取当前节点的所有子元素

    2、parent 选取当前节点的父节点

    3、descendant 选取当前节点的所有后代元素(子、孙等)

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

    5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身

    6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身

    7、preceding-sibling 选取当前节点之前的所有同级节点

    8、following-sibling 选取当前节点之后的所有同级节点

    9、preceding 选取文档中当前节点的开始标签之前的所有节点

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

    11、self 选取当前节点

    12、attribute 选取当前节点的所有属性

    13、namespace 选取当前节点的所有命名空间节点

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    ABC065D Built[最小生成树]
    loj2718 「NOI2018」归程[Kruskal重构树+最短路]
    BZOJ1821 部落划分[最小生成树]
    BZOJ4777 [Usaco2017 Open]Switch Grass[最小生成树+权值线段树套平衡树]
    CF888G Xor-MST[最小生成树+01trie]
    Atcoder CODE FESTIVAL 2016 Final G
    BZOJ4883 [Lydsy1705月赛]棋盘上的守卫[最小基环树森林]
    BZOJ3714 [PA2014]Kuglarz[最小生成树]
    BZOJ1601 [Usaco2008 Oct]灌水[最小生成树]
    CF892E Envy[最小生成树]
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/9301059.html
Copyright © 2020-2023  润新知