1. 程式人生 > >Xpath使用例項和需要注意的事項

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">檢視更多公司資訊&gt;</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進行選擇。