2017-06-29 175 views
0

我是新來的scrapping和scrapy,並且我停留在從html頁面檢索部分數據的語法上。我需要從下面的示例代碼中的價格信息:Scrapy XPath語法從字符串中提取部分數據

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <meta name="google-play-app" content="app-id=com.move.realtor"> 
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 
    <meta name="theme-color" content="#d92228"> 
    <meta name="description" content="View 2 photos of this 0 bed, 1 bath, 227 Sq. Ft. condo/townhome/row home/co-op at 4130 Collins Ave Unit 708, Miami Beach, FL 33140 on sale now for $160,000."/> 

我需要提取16萬

我明白瞭如何提取整個字符串,但我停留在如何提取後的價格信息美元符號。

def parse(self, response): 
     #hxs = HtmlXPathSelector(response) 
     #sites = hxs.select('//div/li/div/a/@href') 
     sites = response.xpath('//head') 
     items = [] 
     for site in sites: 

      item = RealtorItem() 
      item['description'] = site.xpath('meta[@name="description"]/@content').extract() 

此代碼提取整個字符串,並將其放置在項目,我想我不得不分割字符串,只有存儲的美元符號後的信息?我可以使用正則表達式嗎?有沒有更好的辦法 ?

回答

0

找到內容的代碼可能會縮短使用沿着這些行的東西(但不完全是這樣)。

>>> from scrapy.selector import Selector 
>>> selector = Selector(text=fragment) 
>>> content = selector.xpath('.//meta[starts-with(@content,"View 2")]/@content').extract()[0] 
>>> content 
'View 2 photos of this 0 bed, 1 bath, 227 Sq. Ft. condo/townhome/row home/co-op at 4130 Collins Ave Unit 708, Miami Beach, FL 33140 on sale now for $160,000.' 

一旦你有了這些內容,你確實可以使用正則表達式隔離價格。

>>> import re 
>>> m = re.search(r'\$([0-9,.]+)', content) 
>>> m.groups() 
('160,000.',) 

但我的問題是,您如何確定首位的正確meta?這些元素與description/content的組合非常常見。你可以考慮使用這樣的代碼來減少它們的數量來檢查價格,這些代碼尋找美元符號。

>>> which_meta = selector.xpath('.//meta[contains(@content,"$")]') 
>>> which_meta 
[<Selector xpath='.//meta[contains(@content,"$")]' data='<meta name="description" content="View 2'>]