最近偷空研究了一下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 選取當前節點的全部命名空間節點