python使用lxml xpath模块解析XML遇到的坑及解决

 更新时间:2024年05月24日 14:59:37   作者:weixin_45906169  
这篇文章主要介绍了python使用lxml xpath模块解析XML遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

项目场景

解析电子病历CDA文档,由于CDA文档是XML 格式的,有些节点的属性值需要修改。

问题描述

在使用python 解析xml时,百度了很多方面的资料,其实都不尽人意,要么示例不够详细,要么示例本身就是坑,总结一下,主要遇到的是这几个方面的问题

1.使用etree.fromstring(new_doc_content)报错

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

在这里插入图片描述

2.xpath无法获取值、返回值为[]或者{}的问题

原因分析

1.由于数据是从数据库查询出来得到的,所以etree.fromstring(new_doc_content)需要传 byte string

2.由于CDA文档含有字符声明,以及命名空间的,在使用常规的xpath语法取不到数据,或者有些text能取到,其他节点或者属性值取不到。那么在含有命名空间的xml数据里,xpath需要将命名空间也带上才能正常取到,其实问题就出在命名空间这里,从网上百度出来的资料,有些命名空间写成了

ns = {"d" : "http://www.sitemaps.org/schemas/sitemap/0.9"}
url = root.xpath("//d:loc", namespaces=ns)

正是这里把我带入了误区,使用这个方式反复调试,始终是取不到数据,从其他地方查到的资料很多也是类似的这种写法,同时也忽略掉了一些不一样的点。

例如这样的写法:

url = root.xpath("//d:loc", namespaces={'d' : 'http://www.sitemaps.org/schemas/sitemap/0.9'})`

咋一看只是namespaces的值事先定义好了而已,没有往其他方向想。

后来通过foo_tree = etree.ElementTree(xml) 然后通过遍历foo_tree.getroot()修改属性内容,虽然说能解决,但是还是想通过xpath来查询定位,因为之前爬虫用过xpath,知道它的便利之处,回过头来还是要去解决xpath这个问题。

猛回头,发现namespaces字典定义的区别,单引号 和双引号这里有所不同。那就是试试把,将双引号改成了单引号。

啪,完美,它起作用了,能找到节点了。

解决方案

1.将str转换成byte string

etree.fromstring(new_doc_content.encode('utf-8'))

2.将namespaces定义的字典中的双引号换成单引号

url = root.xpath("//d:loc", namespaces={'d' : 'http://www.sitemaps.org/schemas/sitemap/0.9'})`

示例XML

<?xml version="1.0" encoding="UTF-8"?> 
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:mif="urn:hl7-org:v3/mif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 ..\sdschemas\SDA.xsd"> 
<realmCode code="CN"/> 
<typeId root="2.16.840.1.113883.1.3" extension="POCD_MT000040"/> 
<templateId root="2.16.156.10011.2.1.1.33"/> 
<id root="2.16.156.10011.1.1" extension="545ED988-5235-45F1-BBFD-9326D74FAA43"/> 
<code code="00000" codeSystem="545ED988-5235-45F1-BBFD-9326D74FAA43" codeSystemName="卫生信息共享文档规范编码体系"/> 
<title>测试</title> 
<effectiveTime value="20220407090145"/> 
<confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25" codeSystemName="Confidentiality" displayName="正常访问保密级别"/> 
<languageCode code="zh-CN"/> 
<setId/> 
<versionNumber/> 
<recordTarget typeCode="RCT" contextControlCode="OP"> 
<patientRole classCode="PAT"> 
<id root="2.16.156.10011.1.11" extension="00000000"/> 
<id root="2.16.156.10011.1.12" extension="00000000"/> 
<id root="2.16.156.10011.1.24" extension="-"/> 
<patient classCode="PSN" determinerCode="INSTANCE"> 
<name>XXX</name> 
<administrativeGenderCode code="1" displayName="男性" codeSystem="2.16.156.10011.2.3.3.4" codeSystemName="生理性别代码表(GB/T 2261.1)"/> 
<age value="0" unit="岁"/> 
</patient> 
</patientRole> 
</recordTarget> 
</ClinicalDocument>

示例Python

xml = etree.fromstring(new_doc_content.encode('utf-8'))
# 示例的默认命名空间是urn:hl7-org:v3,使用xpath需要将命名空间带上
effective_time = xml.xpath("//x:effectiveTime[@*]", namespaces={'x': 'urn:hl7-org:v3'})
extension = xml.xpath('//x:recordTarget//x:patientRole/x:id[@extension]',
                                         namespaces={'x': 'urn:hl7-org:v3'})
print(effective_time)
print(extension)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Pycharm 2020年最新激活码(亲测有效)

    Pycharm 2020年最新激活码(亲测有效)

    本文给大家分享Pycharm 2020年最新激活码,亲测试过可以放心使用,感兴趣的朋友快来吧
    2020-01-01
  • Python基于SciPy库实现统计分析与建模

    Python基于SciPy库实现统计分析与建模

    SciPy是一个强大的Python库,提供了丰富的科学计算和数据分析工具,本文我们将探讨如何使用Python和SciPy库进行统计分析和建模,感兴趣的可以学习一下
    2023-06-06
  • python进度条库tqdm使用记录(特点和用法)

    python进度条库tqdm使用记录(特点和用法)

    tqdm是一个Python库,用于在命令行界面中创建美观的进度条,以跟踪代码中循环、迭代和任务的执行进度,本文给大家介绍python进度条库tqdm使用记录,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • 总结分析python数据化运营关联规则

    总结分析python数据化运营关联规则

    本文内容主要介绍了python数据化运营中关联规则的一般应用场景,以及关联规则的实现,并例举了适应的应用示例,方便大家更直观的理解应用
    2021-08-08
  • python3实现飞机大战

    python3实现飞机大战

    这篇文章主要为大家详细介绍了python3实现飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 利用Python实现学生信息管理系统的完整实例

    利用Python实现学生信息管理系统的完整实例

    这篇文章主要给大家介绍了关于如何利用Python实现学生信息管理系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 对python 自定义协议的方法详解

    对python 自定义协议的方法详解

    今天小编就为大家分享一篇对python 自定义协议的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python爬虫之你好,李焕英电影票房数据分析

    python爬虫之你好,李焕英电影票房数据分析

    这篇文章主要介绍了python爬虫之你好,李焕英电影票房数据分析,文中有非常详细的代码示例,对正在学习python爬虫的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-04-04
  • Python3.5实现的三级菜单功能示例

    Python3.5实现的三级菜单功能示例

    这篇文章主要介绍了Python3.5实现的三级菜单功能,涉及Python针对json格式数据的读取、遍历、查找、判断等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • 教你使用Python画棵圣诞树完整代码

    教你使用Python画棵圣诞树完整代码

    圣诞节快到了,今天小编通过代码画颗圣诞树,主要通过t.pensize(10) 修改画笔大小,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-12-12

最新评论