python xpath空间未被删除

2024-03-29 08:08:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从一个包含表的html页面中获取一些数据。我在xpath中得到了一个行列表,现在我试图在td的每个元素中得到text(),在tr中,这里是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从价格中删除“,”和“USD”?你知道吗


Tags: textrightfalse元素returnxpathtrclass
2条回答

您需要做的是正确地规范化值:

>>> 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')]
[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'将不包含开头的空格。你知道吗

[]只会像布尔值一样过滤假值,不会改变值。你知道吗

相关问题 更多 >