最近偷空研究了一下python,准备用python写一个爬虫。php
在使用scrapy,爬取网页信息时,我须要去定位节点,因此也就有了下面这篇文章。html
例子代码:node
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语法。python
在探索中我找到了一个能够很方便查找xpath表达式的插件,因为我是chrome浏览器因此安装这个插件网上不少介绍,你能够去这里下载并了解这个插件:在这里 这里面讲解很详细包括安装和使用。chrome
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。(W3School 中有一些用法)浏览器
实例1:获取name为“现病史”结点父节点的父节点(p):【能够看到表达式锁定的p颜色为标记为了黄色。】dom
//span[1]/a[@name='现病史']/parent::node()[1]/parent::node()
实例2:获取子节点(child::node()[1]表明取子节点的第一个,若是不写则是取全部):scrapy
//td/p/child:node()
能够看到一共匹配了376个结果,当前是第九个知足匹配的节点。ide
实例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)可定义某个相对于当前节点的节点集:一、child 选取当前节点的全部子元素二、parent 选取当前节点的父节点三、descendant 选取当前节点的全部后代元素(子、孙等)四、ancestor 选取当前节点的全部先辈(父、祖父等)五、descendant-or-self 选取当前节点的全部后代元素(子、孙等)以及当前节点自己六、ancestor-or-self 选取当前节点的全部先辈(父、祖父等)以及当前节点自己七、preceding-sibling 选取当前节点以前的全部同级节点八、following-sibling 选取当前节点以后的全部同级节点九、preceding 选取文档中当前节点的开始标签以前的全部节点十、following 选取文档中当前节点的结束标签以后的全部节点十一、self 选取当前节点十二、attribute 选取当前节点的全部属性1三、namespace 选取当前节点的全部命名空间节点