Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python xpath空间未被删除_Python_Xpath - Fatal编程技术网

python xpath空间未被删除

python xpath空间未被删除,python,xpath,Python,Xpath,我试图从一个包含表格的html页面中获取一些数据。我在xpath中得到了一个行列表,现在我试图在td的每个元素中得到text(),在tr中,下面是tr的基本结构 <tr> <td> <a href="#" onclick="WhoisOrderDomain('bank'); return false;"> SHOP </a> </td> <td>COUNTR

我试图从一个包含表格的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>
我得到了这个输出:

['\r\n                          SHOP\r\n                        ', 'COUNTRY', '1038,00 USD', '899,00 USD', '899,00 USD', ' Order']
为什么不从第一个元素中删除空格

另外,如何使用xpath从价格中删除“,”和“USD”

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

[normalize-space()]
是一个清除空字符串的过滤器。如果需要获取标记下的字符串,请使用
规范化空格(标记)

使用
strip
replace
去除
USD

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

编辑:

输出:

如果
[normalize-space()]
影响字符串,则输出的
'Order'
将不包含开头的空格


[]
只会像布尔值一样过滤假值,它不会更改值。

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

>>> from decimal import Decimal
>>> Decimal('1 038,00 USD'.rstrip('USD').replace(' ','').replace(',','.'))
Decimal('1038.00')
始终使用
十进制
表示货币值。这避免了数字不准确的问题,这些问题困扰着浮动,并且可能会花费你几美分


要处理列表,请过滤掉那些不是货币值的字符串(在本例中是那些不是以
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')]
>>> 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')]
>>> monetary_values
[Decimal('135.00'), Decimal('135.00'), Decimal('0.00')]

@anekix[normalize-space()]是一个清除空字符串的过滤器。它不会改变字符串。谢谢你的回复,但是我很难理解为什么我的代码不能工作
/td/a/text()[normalize-space()?因为下一个语法相同的xpath正在运行,我如何才能从货币中删除“,”和USD?@anekix
[td.xpath('normalize-space()')).strip('USD')。在tree.xpath('//tr/td')]
感谢您的帮助:)中替换(',','')td。但是为什么在我的xpath中空间没有被规范化呢?我希望使用xpathi获得这样的结果['.ac.tz',坦桑尼亚','135,00 USD','135,00 USD','0,00 USD','Order']我如何将此应用于它?
>>> 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')]