如何通过Xpath仅提取标签中的数字?现有代码返回含字符列表
仅用Xpath提取数字的解决方案
根据你使用的Xpath版本,有两种可行的处理方式:
Xpath 1.0 环境(主流Python解析库如lxml默认使用)
Xpath 1.0没有原生正则支持,可通过两种方式实现数字提取:
方式1:嵌套translate函数过滤非数字
利用translate的特性,先提取所有非数字字符,再将这些字符从原字符串中移除:
hots = html.xpath('translate(//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/span/text(), translate(//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/span/text(), "0123456789", ""), "")')[1:]
- 内层
translate:把原字符串中的数字全部替换为空,得到所有非数字字符集合 - 外层
translate:把原字符串中的这些非数字字符全部移除,最终只保留数字
方式2:Xpath提取后用Python过滤(更简洁易维护)
如果觉得Xpath写法过于繁琐,更推荐先提取原始内容,再用Python代码过滤数字:
# 先获取原始列表 hots_raw = html.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/span/text()')[1:] # 方法A:遍历字符筛选数字 hots = [''.join([c for c in item if c.isdigit()]) for item in hots_raw] # 方法B:用正则替换非数字字符 import re hots = [re.sub(r'\D', '', item) for item in hots_raw]
Xpath 2.0+ 环境(如使用Saxon等支持高版本Xpath的解析器)
Xpath 2.0及以上支持正则表达式,可直接用replace函数一键替换非数字内容:
hots = html.xpath('replace(//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/span/text(), "\D", "")')[1:]
内容的提问来源于stack exchange,提问作者XXXten6b
相关产品推荐
相关产品推荐

