Xpath使用实例和需要注意的事项

版权声明:随意了,开心就好。反正是给大家分享的笔记 https://blog.csdn.net/u011486491/article/details/84962125

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

猜你喜欢

转载自blog.csdn.net/u011486491/article/details/84962125