2013-04-23 60 views
0

我想從以下兩個網頁中提取價格信息:xpath:如何編寫條件xpaths?

http://jujumarts.com/mobiles-accessories-smartphones-wildfire-sdarkgrey-p-551.html http://jujumarts.com/computers-accessories-transcend-500gb-portable-storejet-25d2-p-2616.html

xpath1 = //span[@class='productSpecialPrice']//text() 
xpath2 = //div[@class='proDetPrice']//text() 

截至目前我已經寫Python代碼,返回xpath1的結果,如果它是成功的,否則執行第二個。我有一種感覺,可以在xpath中單獨實現這個邏輯,有人能告訴我怎麼做嗎?

+0

我正在處理數百個網站,併爲每個門戶處理多個xpath以便能夠使用try /除了看起來很笨拙。顯然,XPath 2.0非常有能力做到這一點。 – 2013-04-23 12:48:39

回答

4

使用|指示union

xpath3 = "//span[@class='productSpecialPrice']//text()|//div[@class='proDetPrice']//text()" 

這不正是你問什麼,但我認爲它可以在一個可行的解決方案被納入。


the XPath (version 1.0) specs

的|運算符計算它的操作數的並集,它必須是 節點集。


例如,

import lxml.html as LH 

urls = [ 
    'http://jujumarts.com/mobiles-accessories-smartphones-wildfire-sdarkgrey-p-551.html', 
    'http://jujumarts.com/computers-accessories-transcend-500gb-portable-storejet-25d2-p-2616.html' 
    ] 

xpaths = [ 
    "//span[@class='productSpecialPrice']//text()", 
    "//div[@class='proDetPrice']//text()", 
    "//span[@class='productSpecialPrice']//text()|//div[@class='proDetPrice']//text()" 
    ] 
for url in urls: 
    doc = LH.parse(url) 
    for xpath in xpaths: 
     print(doc.xpath(xpath)) 
    print 

產生

['Rs.11,800.00'] 
['Rs.13,299.00', 'Rs.11,800.00'] 
['Rs.13,299.00', 'Rs.11,800.00'] 

[] 
['Rs.7,000.00'] 
['Rs.7,000.00'] 

另一種方式來獲得你想要的信息是

"//*[@class='productSpecialPrice' or @class='proDetPrice']//text()" 
+0

@root:你能詳細說明一下嗎?問題是什麼? – unutbu 2013-04-23 13:03:33

+0

當'|'實際上表示有些不同的東西時,你不能說「用'|'來指示'或'」,就像OP所說的那樣:'如果成功則返回xpath1的結果,否則執行第二個' – root 2013-04-23 13:08:01

+0

@root:雖然這是真的,但我認爲OP可能會花費最低的價格,因爲希望「SpecialPrice」總是低於正常價格。 – unutbu 2013-04-23 13:10:32