我正在尝试从包含表格的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;从价格?
答案 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)
使用strip
或replace
摆脱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')]