2017-01-30 81 views
1

我想從其中有表的html頁面獲取一些數據。我得到了行烏金的XPath的名單,現在我想獲得的tdtr每個元素內的文本(),這裏是trpython xpath空間沒有被刪除

<tr> 
    <td> 
    <a href="#" onclick="WhoisOrderDomain('bank'); return false;"> SHOP 
         </a> 
    </td> 
    <td>COUNTRY</td> 
    <td class="text-right">1 038,00 USD</td> 
    <td class="text-right">899,00 USD</td> 
    <td class="text-right">899,00 USD</td> 
    <td class="text-center"> 
<a class="btn btn-sm btn-info" href="#" onclick="WhoisOrderDomain('bank'); return false;"><i class="fa fa-shopping-cart"></i> Order</a> 
         </td> 
        </tr> 
下面

的基本結構是我在Python的XPath:

td_xpath = XPath("./td/a/text()[normalize-space()] | ./td/text()[normalize-space()]") 

和我得到這個輸出:

['\r\n       SHOP\r\n      ', 'COUNTRY', '1038,00 USD', '899,00 USD', '899,00 USD', ' Order'] 

空間爲什麼不從第一個元素刪除嗎?

如何使用xpath從價格中刪除','和'USD'?

回答

1
[td.xpath('normalize-space()')for td in tree.xpath('//tr/td')] 

出來:

['SHOP', 'COUNTRY', '1 038,00 USD', '899,00 USD', '899,00 USD', 'Order'] 

[normalize-space()]是擺脫空字符串的過濾器。如果你需要得到一個標籤下的字符串,請使用normalize-space(tag)

使用stripreplace擺脫USD

[td.xpath('normalize-space()').strip(' USD') for td in tree.xpath('//tr/td')] 

出來:

['HOP', 'COUNTRY', '1 038,00', '899,00', '899,00', 'Order'] 

編輯:

tree.xpath('//tr/td//text()') 

出:

['\n ',       # empty, discard 
' SHOP\n      ', 
'\n ',        # empty, discard 
'COUNTRY', 
'1 038,00 USD', 
'899,00 USD', 
'899,00 USD', 
'\n',        # empty, discard 
' Order', 
'\n      ']   # empty, discard 

如果[normalize-space()]影響字符串,那麼輸出' Order'在開始時將不包含空白。

[]只會像布爾值一樣過濾false值,它不會更改該值。

+0

在爲什麼我的代碼不工作我上面的例子嗎? – anekix

+0

@anekix [normalize-space()]是一個過濾器,可以清除空字符串。它不會改變字符串。 –

+0

Thankyou爲你的迴應,但我有difficuly理解爲什麼我的代碼不工作? './td/a/text()[normalize-space()]'this seleects/td/a/text()然後將過濾器應用於它?因爲具有相同語法的下一個xpath正在工作 – anekix

0

你需要做的是正確的正常化值:

>>> from decimal import Decimal 
>>> Decimal('1 038,00 USD'.rstrip('USD').replace(' ','').replace(',','.')) 
Decimal('1038.00') 

始終使用Decimal的貨幣價值。這樣可以避免數字不準確的問題,而且會花費您的費用。


要處理你過濾掉那些不能在這種情況下,那些沒有在USD結束貨幣值的字符串列表(也可能是適合您的XML輸入更好的另一種方式),然後轉換的其餘部分:

input_values = ['.ac.tz', 'Tanzania', '135,00 USD', '135,00 USD', '0,00 USD', ' Order'] 
monetary_values = [Decimal(v.rstrip('USD').replace(' ','').replace(',','.')) 
        for v in input_values if v.endswith('USD')] 

結果:

>>> monetary_values 
[Decimal('135.00'), Decimal('135.00'), Decimal('0.00')] 

或者你可以嘗試每一個項目轉換,而忽略那些引發異常:

import decimal 
from decimal import Decimal 

input_values = ['.ac.tz', 'Tanzania', '135,00 USD', '135,00 USD', '0,00 USD', ' Order'] 

monetary_values = [] 
for v in input_values: 
    try: 
     monetary_values.append(Decimal(v.rstrip('USD').replace(' ','').replace(',','.'))) 
    except decimal.InvalidOperation: 
     pass 

,這也導致:

>>> monetary_values 
[Decimal('135.00'), Decimal('135.00'), Decimal('0.00')] 
+0

但爲什麼我的xpath中的空間沒有正常化?我想用xpath的結果 – anekix

+0

我很喜歡這個清單['.ac.tz','坦桑尼亞','135,00 USD','135,00 USD','0,00 USD','訂購'] 我該如何運用它呢? – anekix