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进行选择。