python xpath空间没有被删除

时间:2017-01-30 08:03:00

标签: python xpath

我正在尝试从包含表格的html页面获取一些数据。我得到了一个行列表ugin xpath,现在我想在td内的tr内的每个元素中获取text(),这里是tr的基本结构

<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删除&#39;,&#39;和&#39; USD&#39;从价格?

2 个答案:

答案 0 :(得分: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值,它不会改变值。

答案 1 :(得分: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')]