2017-01-30 58 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