最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用lxml xpath模塊解析XML遇到的坑及解決

 更新時間:2024年05月24日 14:59:37   作者:weixin_45906169  
這篇文章主要介紹了python使用lxml xpath模塊解析XML遇到的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

項目場景

解析電子病歷CDA文檔,由于CDA文檔是XML 格式的,有些節(jié)點的屬性值需要修改。

問題描述

在使用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.由于數(shù)據(jù)是從數(shù)據(jù)庫查詢出來得到的,所以etree.fromstring(new_doc_content)需要傳 byte string

2.由于CDA文檔含有字符聲明,以及命名空間的,在使用常規(guī)的xpath語法取不到數(shù)據(jù),或者有些text能取到,其他節(jié)點或者屬性值取不到。那么在含有命名空間的xml數(shù)據(jù)里,xpath需要將命名空間也帶上才能正常取到,其實問題就出在命名空間這里,從網(wǎng)上百度出來的資料,有些命名空間寫成了

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

正是這里把我?guī)肓苏`區(qū),使用這個方式反復調(diào)試,始終是取不到數(shù)據(jù),從其他地方查到的資料很多也是類似的這種寫法,同時也忽略掉了一些不一樣的點。

例如這樣的寫法:

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

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

后來通過foo_tree = etree.ElementTree(xml) 然后通過遍歷foo_tree.getroot()修改屬性內(nèi)容,雖然說能解決,但是還是想通過xpath來查詢定位,因為之前爬蟲用過xpath,知道它的便利之處,回過頭來還是要去解決xpath這個問題。

猛回頭,發(fā)現(xiàn)namespaces字典定義的區(qū)別,單引號 和雙引號這里有所不同。那就是試試把,將雙引號改成了單引號。

啪,完美,它起作用了,能找到節(jié)點了。

解決方案

1.將str轉(zhuǎn)換成byte string

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

2.將namespaces定義的字典中的雙引號換成單引號

url = root.xpath("http://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="衛(wèi)生信息共享文檔規(guī)范編碼體系"/> 
<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("http://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)

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用Docker構建Python Flask程序的詳細教程

    使用Docker構建Python Flask程序的詳細教程

    在當今的軟件開發(fā)領域,容器化技術正變得越來越流行,而 Docker 無疑是其中的佼佼者,本文我們就來聊聊如何使用 Docker 構建一個簡單的 Python Flask 程序吧
    2025-07-07
  • win10下python2和python3共存問題解決方法

    win10下python2和python3共存問題解決方法

    在本篇文章里小編給大家整理了關于win10下python2和python3共存問題解決方法,有興趣的朋友們參考下。
    2019-12-12
  • Python3實現(xiàn)從文件中讀取指定行的方法

    Python3實現(xiàn)從文件中讀取指定行的方法

    這篇文章主要介紹了Python3實現(xiàn)從文件中讀取指定行的方法,涉及Python中l(wèi)inecache模塊操作文件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • PyCharm2019安裝教程及其使用(圖文教程)

    PyCharm2019安裝教程及其使用(圖文教程)

    這篇文章主要介紹了PyCharm2019安裝教程(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Python調(diào)用JS代碼的方法大全

    Python調(diào)用JS代碼的方法大全

    這篇文章主要為大家詳細介紹了Python調(diào)用JavaScript代碼的三種常用代碼,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-05-05
  • python?pandas?query的使用方法

    python?pandas?query的使用方法

    這篇文章主要介紹了python?pandas?query的使用方法,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • Python寫代碼的七條重要技巧介紹

    Python寫代碼的七條重要技巧介紹

    大家好,本篇文章主要講的是Python寫代碼的七條重要技巧介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python 使用三引號時容易犯的小錯誤

    python 使用三引號時容易犯的小錯誤

    這篇文章主要介紹了python 使用三引號時容易犯的小錯誤,幫助新手學習,避免入坑,感興趣的朋友可以了解下
    2020-10-10
  • Python使用Ollama API的詳細代碼示例

    Python使用Ollama API的詳細代碼示例

    這篇文章主要介紹了如何在Python中使用OllamaAPI,涵蓋了從環(huán)境準備、使用方法到高級功能的全面指南,無論是初學者還是經(jīng)驗豐富的開發(fā)者都能從中受益,需要的朋友可以參考下
    2025-02-02
  • python 如何將字典寫為json文件

    python 如何將字典寫為json文件

    這篇文章主要介紹了python 如何將字典寫為json文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

莱西市| 黄梅县| 奉贤区| 临武县| 府谷县| 福泉市| 神农架林区| 锡林浩特市| 兰州市| 芒康县| 潮州市| 江华| 肇庆市| 始兴县| 龙山县| 乌审旗| 石城县| 松阳县| 永城市| 应用必备| 固安县| 佛山市| 深圳市| 广水市| 通州市| 县级市| 台前县| 门源| 依兰县| 无极县| 兴海县| 巨鹿县| 柳州市| 宜阳县| 沁源县| 老河口市| 康乐县| 大关县| 高淳县| 诏安县| 彝良县|