第六篇 xpath的用法


 使用pycharm debug調試效率會比較慢,因為每次調試都需要向url發送請求,等返回信息,scrapy提供一種方便調試的功能,如下:

>>>(third_project) bigni@bigni:pachong$ scrapy shell http://blog.jobbole.com/112239/
>>> title = response.xpath('//*[@id="post-112239"]/div[1]/h1')
>>> title
[<Selector xpath='//*[@id="post-112239"]/div[1]/h1' data='<h1>谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征</h1>'>]
>>> title.extract()
['<h1>谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征</h1>']
>>> title = response.xpath('//*[@id="post-112239"]/div[1]/h1/text()')
>>> title
[<Selector xpath='//*[@id="post-112239"]/div[1]/h1/text()' data='谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征'>]

extract()方法可以取到select list里的date,text()方法可以取到內容。

In [37]: title2 = response.xpath("//*[@id='post-112239']/div[1]/h1").extract()

In [38]: title2
Out[38]: ['<h1>谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征</h1>']

In [39]: title2 = response.xpath("//*[@id='post-112239']/div[1]/h1")

In [40]: title2
Out[40]: [<Selector xpath="//*[@id='post-112239']/div[1]/h1" data='<h1>谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征</h1>'>]

In [41]: title2 = response.xpath("//*[@id='post-112239']/div[1]/h1/text()").extr
    ...: act()

In [42]: title2
Out[42]: ['谷歌用兩年時間研究了 180 個團隊,發現高效團隊有這五個特征']

In [43]: 

 

PS:在chrome里,按F12看到的代碼是加載完所有插件后的,比如JS,如果通過通過根路徑來定位要找的內容是容易出錯的,因為xpath搜索的不會把js等生成的元素計算在內,這個可以通過鼠標右鍵查看源碼來判斷哪些是js生成的,然后過濾掉。

對於屬性里有多個值的情況,比如class 里有多個值:

可以使用scrapy內置的contains方法:

In [44]: ret = response.xpath("//div[contains(@class,'post-112239')]")

In [45]: ret
Out[45]: [<Selector xpath="//div[contains(@class,'post-112239')]" data='<div class="post-112239 post type-post s'>]

 

如果要爬取下面這個內容,可以這么操作:

 

 

In [54]: rest = response.xpath('//*[@id="post-112239"]/div[3]/div[4]/span[2]/tex
    ...: t()').extract()[0]

In [55]: rest
Out[55]: ' 8 收藏'

接着再用正則去掉別的信息,由於在scrapy shell中直接調用re模塊會報錯,那可以用ipython調試

In [71]: ret = re.match(r".*(\d+).*",' 8 收藏')

In [72]: ret.group(1)
Out[72]: '8'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM