Xpath使用例項和需要注意的事項
Xpath使用例項和需要注意的事項
Xpath的語法介紹就不贅述了,參考:https://blog.csdn.net/u011486491/article/details/84061432
這篇文章就以實際使用為例,對一些xpath比較複雜的情況進行討論使用。
常用的標籤提取欄位
<li class="tjqyList-content"> <div class="tjqyList-contentLf"> <!-- <h4 class="tjqyList-contentLf-company">大理市昌建捲簾門廠 <span>生意通</span></h4>--> <h4 class="tjqyList-contentLf-company xh-highlight"><a href="http://www.jqw.com/corpshow-2018000058762.htm" target="_blank">大理市昌建捲簾門廠</a> <span>生意通VIP</span></h4> <p class="tjqyList-contentLf-ckgd"><a href="http://www.jqw.com/corpshow-2018000058762.htm" target="_blank">檢視更多公司資訊></a></p> <p class="fabuTime"><span>釋出時間:</span>2018-11-29</p> </div> <div class="tjqyList-contentRt"> <!--imglis_start--> <div class="tjqyList-contentRt-pic"> <a href="http://www.dlcj.jqw.com/productShow-282932.htm" target="_blank"> <img src="http://img3.jqw.com/2018/11/27/1914201/product/201811291549351233.jpg" alt=""> <p>大理車庫門定做</p> </a> </div> <!--imglis_end--> </div> </li>
兩個標籤間的內容:text()
//div[@class='tjqyList-contentLf']/h4[@class='tjqyList-contentLf-company']/a/text()
標籤內的屬性:@title @class @href
//div[@class='tjqyList-contentLf']/h4[@class='tjqyList-contentLf-company']/a/@href
模糊提取模式
函式 | 用法 | 解釋 |
---|---|---|
starts-with | xpath(‘//div[starts-with(@id,”ma”)]‘) | 選取id值以ma開頭的div節點 |
contains | xpath(‘//div[contains(@id,”ma”)]‘) | 選取id值包含ma的div節點 |
and | xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) | 選取id值包含ma和in的div節點 |
text() | xpath(‘//div[contains(text(),”ma”)]‘) | 選取節點文字包含ma的div節點 |
選取a標籤下text包含“聯絡”和“昆明”欄位的a標籤
//a [contains(text(),"聯絡") and contains(text(),"昆明")]
找去a標籤下text包含“聯絡”和“昆明”欄位並且title屬性中包含化妝的a標籤
//a[contains(text(),"聯絡") and contains(text(),"昆明") and contains(@title,"化妝")]
注意:
xpath = response.xpath('//span[@class="total"]/text()').extract() 通過xpath得到的資料是一個selector的陣列:
<Selector xpath='//span[@class="total"]/text()' data='共50頁'>] 通過.extract()之後才能拿到String的值
巢狀分層提取
def parse(self, response): self.pagecount += 1 print('--------------'+str(self.pagecount)+'---------------') if(self.pagecount == self.totalPage): return # 解析使用者資料 dataArray = response.xpath('//div[@class="tjqyList-contentLf"]') for each in dataArray: item = ItemJinQuanCompanyInfo() item['companyName']=each.xpath('h4[@class="tjqyList-contentLf-company"]/a/text()').extract() item['business']=each.xpath('p[@class="tjqyList-contentLf-hy"]/text()').extract() item['address']=each.xpath('p[@class="tjqyList-contentLf-adr"]/text()').extract() item['phone']=each.xpath('p[@class="tjqyList-contentLf-lx"]/text()').extract() item['people']=each.xpath('p[@class="tjqyList-contentLf-yg"]/text()').extract() yield item requestUrl = self.baseUrl + "/"+str(self.pagecount) +"/" + "area.html" yield Request(requestUrl, callback=self.parse)
注意事項
1、在巢狀分層提取的時候,需要注意:我們需要提取的是selector,如果加入.extract()就變成了String,就無法呼叫.xpath()了。在第二層提取的時候
each.xpath('p[@class="tjqyList-contentLf-hy"]/text()').extract()
沒有了//而這是是預設以第一層的結果進行匹配的
2、對列表中的各個元素呼叫 .extract()
方法,返回結果為單一化的unicode字串列表。
3、selector,它是對選擇某些內容響應的封裝。他可以繼續用xpath進行選擇。