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