Python解析xml文档实战案例
xml文档
<?xml version="1.0" ?>
<!DOCTYPE PubmedArticleSet PUBLIC "-//NLM//DTD PubMedArticle, 1st January 2019//EN" "https://dtd.nlm.nih.gov/ncbi/pubmed/out/pubmed_190101.dtd">
<PubmedArticleSet>
<PubmedArticle>
<MedlineCitation Status="MEDLINE" Owner="NLM">
<PMID Version="1">28901317</PMID>
<DateCompleted>
<Year>2018</Year>
<Month>05</Month>
<Day>10</Day>
</DateCompleted>
<DateRevised>
<Year>2018</Year>
<Month>12</Month>
<Day>02</Day>
</DateRevised>
<Article PubModel="Print">
<Journal>
<ISSN IssnType="Electronic">1998-4138</ISSN>
<JournalIssue CitedMedium="Internet">
<Volume>13</Volume>
<Issue>4</Issue>
<PubDate>
<Year>2017</Year>
</PubDate>
</JournalIssue>
<Title>Journal of cancer research and therapeutics</Title>
<ISOAbbreviation>J Cancer Res Ther</ISOAbbreviation>
</Journal>
<ArticleTitle><i>k-RAS</i> mutation and resistance to epidermal growth factor receptor-tyrosine kinase inhibitor treatment in patients with nonsmall cell lung cancer.</ArticleTitle>
<Pagination>
<MedlinePgn>699-701</MedlinePgn>
</Pagination>
<ELocationID EIdType="doi" ValidYN="Y">10.4103/jcrt.JCRT_468_17</ELocationID>
<Abstract>
<AbstractText Label="OBJECTIVE" NlmCategory="OBJECTIVE">The aim of this study was to evaluate the relationship between k-RAS gene mutation and the resistance to epidermal growth factor receptor-tyrosine kinase inhibitor (EGFR-TKI) treatment in patients with nonsmall-cell lung cancer (NSCLC).</AbstractText>
<AbstractText Label="METHODS" NlmCategory="METHODS">Forty-five pathologies confirmed NSCLC patients who received EGFR-TKI (Gefitinib) treatment were retrospectively included in this study. The mutation of codon 12 and 13, located in exon1 and exon 2 of k-RAS gene were examined by polymerase chain reaction (PCR) and DAN sequencing in tumor samples of the included 45 NSCLC patients. The correlation between Gefitinib treatment response and k-RAS mutation status was analyzed in tumor samples of the 45 NSCLC patients.</AbstractText>
<AbstractText Label="RESULTS" NlmCategory="RESULTS">Eight tumor samples of the 45 NSCLC patients were found to be mutated in coden 12 or 13, with an mutation rate of 17.8% (8/45); the objective response rate (ORR) was 29.7%(11/37) with 1 cases of complete response (CR) and 10 cases of partial response in k-RAS mutation negative patients. Furthermore, the ORR was 0.0% in k-RAS mutation positive patients with none CR. The ORR between k-RAS mutation and nonmutation patients were significant different (P < 0.05).</AbstractText>
<AbstractText Label="CONCLUSION" NlmCategory="CONCLUSIONS">k-RAS gene mutation status was associated with the response of Gefitinib treatment in patients with NSCLC.</AbstractText>
</Abstract>
<AuthorList CompleteYN="Y">
<Author ValidYN="Y">
<LastName>Zhou</LastName>
<ForeName>Bin</ForeName>
<Initials>B</Initials>
<AffiliationInfo>
<Affiliation>Department of Pharmacy, The First Affiliated Hospital of Wenzhou Medical University, Wenzhou, Zhejiang, Province 325200, PR China.</Affiliation>
</AffiliationInfo>
</Author>
<Author ValidYN="Y">
<LastName>Tang</LastName>
<ForeName>Congrong</ForeName>
<Initials>C</Initials>
<AffiliationInfo>
<Affiliation>Department of Pharmacy, The First Affiliated Hospital of Wenzhou Medical University, Wenzhou, Zhejiang, Province 325200, PR China.</Affiliation>
</AffiliationInfo>
</Author>
<Author ValidYN="Y">
<LastName>Li</LastName>
<ForeName>Jie</ForeName>
<Initials>J</Initials>
<AffiliationInfo>
<Affiliation>Department of Pharmacy, Ruian People's Hospital, Ruian, Zhejiang, Province 325200, PR China.</Affiliation>
</AffiliationInfo>
</Author>
</AuthorList>
<Language>eng</Language>
<PublicationTypeList>
<PublicationType UI="D016428">Journal Article</PublicationType>
</PublicationTypeList>
</Article>
<MedlineJournalInfo>
<Country>India</Country>
<MedlineTA>J Cancer Res Ther</MedlineTA>
<NlmUniqueID>101249598</NlmUniqueID>
<ISSNLinking>1998-4138</ISSNLinking>
</MedlineJournalInfo>
<ChemicalList>
<Chemical>
<RegistryNumber>0</RegistryNumber>
<NameOfSubstance UI="C117307">KRAS protein, human</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>0</RegistryNumber>
<NameOfSubstance UI="D047428">Protein Kinase Inhibitors</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>0</RegistryNumber>
<NameOfSubstance UI="D011799">Quinazolines</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>EC 2.7.10.1</RegistryNumber>
<NameOfSubstance UI="C512478">EGFR protein, human</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>EC 2.7.10.1</RegistryNumber>
<NameOfSubstance UI="D066246">ErbB Receptors</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>EC 3.6.5.2</RegistryNumber>
<NameOfSubstance UI="D016283">Proto-Oncogene Proteins p21(ras)</NameOfSubstance>
</Chemical>
<Chemical>
<RegistryNumber>S65743JHBS</RegistryNumber>
<NameOfSubstance UI="D000077156">Gefitinib</NameOfSubstance>
</Chemical>
</ChemicalList>
<CitationSubset>IM</CitationSubset>
<MeshHeadingList>
<MeshHeading>
<DescriptorName UI="D000328" MajorTopicYN="N">Adult</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D000368" MajorTopicYN="N">Aged</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D002289" MajorTopicYN="N">Carcinoma, Non-Small-Cell Lung</DescriptorName>
<QualifierName UI="Q000188" MajorTopicYN="Y">drug therapy</QualifierName>
<QualifierName UI="Q000235" MajorTopicYN="N">genetics</QualifierName>
<QualifierName UI="Q000473" MajorTopicYN="N">pathology</QualifierName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D019008" MajorTopicYN="N">Drug Resistance, Neoplasm</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D066246" MajorTopicYN="N">ErbB Receptors</DescriptorName>
<QualifierName UI="Q000037" MajorTopicYN="N">antagonists & inhibitors</QualifierName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D005260" MajorTopicYN="N">Female</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D000077156" MajorTopicYN="N">Gefitinib</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D006801" MajorTopicYN="N">Humans</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D008297" MajorTopicYN="N">Male</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D008875" MajorTopicYN="N">Middle Aged</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D009154" MajorTopicYN="N">Mutation</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D047428" MajorTopicYN="N">Protein Kinase Inhibitors</DescriptorName>
<QualifierName UI="Q000008" MajorTopicYN="Y">administration & dosage</QualifierName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D016283" MajorTopicYN="N">Proto-Oncogene Proteins p21(ras)</DescriptorName>
<QualifierName UI="Q000235" MajorTopicYN="Y">genetics</QualifierName>
</MeshHeading>
<MeshHeading>
<DescriptorName UI="D011799" MajorTopicYN="N">Quinazolines</DescriptorName>
<QualifierName UI="Q000008" MajorTopicYN="Y">administration & dosage</QualifierName>
</MeshHeading>
</MeshHeadingList>
</MedlineCitation>
<PubmedData>
<History>
<PubMedPubDate PubStatus="entrez">
<Year>2017</Year>
<Month>9</Month>
<Day>14</Day>
<Hour>6</Hour>
<Minute>0</Minute>
</PubMedPubDate>
<PubMedPubDate PubStatus="pubmed">
<Year>2017</Year>
<Month>9</Month>
<Day>14</Day>
<Hour>6</Hour>
<Minute>0</Minute>
</PubMedPubDate>
<PubMedPubDate PubStatus="medline">
<Year>2018</Year>
<Month>5</Month>
<Day>11</Day>
<Hour>6</Hour>
<Minute>0</Minute>
</PubMedPubDate>
</History>
<PublicationStatus>ppublish</PublicationStatus>
<ArticleIdList>
<ArticleId IdType="pubmed">28901317</ArticleId>
<ArticleId IdType="pii">JCanResTher_2017_13_4_699_214476</ArticleId>
<ArticleId IdType="doi">10.4103/jcrt.JCRT_468_17</ArticleId>
</ArticleIdList>
</PubmedData>
</PubmedArticle> </PubmedArticleSet>
方法一:xml.etree.cElementTre
# -*- coding: utf-8 -*- """
@Datetime: 2019/4/25
@Author: Zhang Yafei
"""
import os
import re
import threading
import xml.etree.cElementTree as ET
from concurrent.futures import ThreadPoolExecutor
from itertools import chain import pandas as pd def pubmed_xml_parser(path):
dir_name = path.split('\\')[0]
print(dir_name)
etree = ET.parse(path)
root = etree.getroot()
data_list = []
pmid_set = []
for articles in root.iter('PubmedArticle'):
pmid = articles.find('MedlineCitation').find('PMID').text
if pmid in pmid_set:
continue
pmid_set.append(pmid)
Article = articles.find('MedlineCitation').find('Article')
journal = Article.find('Journal').find('ISOAbbreviation').text
try:
authors = Article.find('AuthorList').findall('Author')
affiliations_info = set()
for author in authors:
# author_name = author.find('LastName').text + ' ' + author.find('ForeName').text
affiliations = [x.find('Affiliation').text for x in author.findall('AffiliationInfo')]
# author = author_name + ':' + ';'.join(affiliations)
for affiliation in affiliations:
affiliations_info.add(affiliation)
affiliations_info = ';'.join(affiliations_info)
except AttributeError:
affiliations_info = ''
try:
date = Article.find('Journal').find('JournalIssue').find('PubDate').find('Year').text
except AttributeError:
date = Article.find('Journal').find('JournalIssue').find('PubDate').find('MedlineDate').text
date = re.search('\d+', date).group(0)
try:
mesh_words = []
for mesh_heading in articles.find('MedlineCitation').find('MeshHeadingList').findall('MeshHeading'):
if len(list(mesh_heading)) == 1:
mesh_words.append(list(mesh_heading)[0].text)
continue
mesh_name = ''
for mesh in mesh_heading:
if mesh.tag == 'DescriptorName':
mesh_name = mesh.text
continue
if mesh_name and mesh.tag == 'QualifierName':
mesh_word = mesh_name + '/' + mesh.text
mesh_words.append(mesh_word)
mesh_words = ';'.join(mesh_words)
except AttributeError:
print(articles.find('MedlineCitation').find('PMID').text)
mesh_words = ''
article_type = '/'.join([x.text for x in Article.find('PublicationTypeList').getchildren()])
country = articles.find('MedlineCitation').find('MedlineJournalInfo').find('Country').text
data_list.append(
{'PMID': pmid, 'journal': journal, 'affiliations_info': affiliations_info, 'pub_year': date,
'mesh_words': mesh_words,
'country': country, 'article_type': article_type, 'file_path': path})
print(pmid + '\t解析完成')
df = pd.DataFrame(data_list)
with threading.Lock():
df.to_csv('{}.csv'.format(dir_name), encoding='utf_8_sig', mode='a', index=False, header=False) def to_excel(data, path):
writer = pd.ExcelWriter(path)
data.to_excel(writer, sheet_name='table', index=False)
writer.save() def get_files_path():
for base_path, folders, files in os.walk('first in class drug'):
file_list = [os.path.join(base_path, file) for file in files if file.endswith('.xml')]
for base_path, folders, files in os.walk('follow on drug'):
file_list.extend([os.path.join(base_path, file) for file in files if file.endswith('.xml')])
for base_path, folders, files in os.walk('me too drug'):
file_list.extend([os.path.join(base_path, file) for file in files if file.endswith('.xml')])
if os.path.exists('first in class drug.csv') or os.path.exists('follow on drug.csv') or os.path.exists(
'me too drug.csv'):
if os.path.exists('first in class drug.csv'):
df = pd.read_csv('first in class drug.csv', encoding='utf-8')
has_files_list = df.file_path.tolist()
if os.path.exists('follow on drug.csv'):
df = pd.read_csv('follow on drug.csv', encoding='utf-8')
has_files_list = chain(has_files_list, df.file_path.tolist())
if os.path.exists('me too drug.csv'):
df = pd.read_csv('me too drug.csv', encoding='utf-8')
has_files_list = chain(has_files_list, df.file_path.tolist())
print('共需解析文件:{0}'.format(len(file_list)))
has_files_list = set(has_files_list)
file_list = set(file_list) - has_files_list
print('已解析文件:{0}'.format(len(has_files_list)))
else:
df = pd.DataFrame(
columns=['PMID', 'affiliations_info', 'article_type', 'country', 'file_path', 'journal', 'mesh_words',
'pub_year'])
df.to_csv('follow on drug.csv', encoding='utf_8_sig', index=False)
df.to_csv('first in class drug.csv', encoding='utf_8_sig', index=False)
df.to_csv('me too drug.csv', encoding='utf_8_sig', index=False)
print('共需解析文件:{0}'.format(len(file_list)))
print('已解析文件:0')
return file_list if __name__ == '__main__':
files_list = get_files_path()
if not files_list:
print('全部解析完成')
else:
with ThreadPoolExecutor(max_workers=os.cpu_count()) as pool:
pool.map(pubmed_xml_parser, files_list)
方法二:lxml+xpath
# -*- coding: utf-8 -*- """
@Datetime: 2019/4/26
@Author: Zhang Yafei
"""
import os
import re
import threading
from concurrent.futures import ThreadPoolExecutor from lxml import etree
import pandas as pd def pubmed_xpath_parse(path):
tree = etree.parse(path)
# 如果xml数据中出现了关于dtd的声明(如下面的例子),那样的话,必须在使用lxml解析xml的时候,进行相应的声明。
# parser = etree.XMLParser(load_dtd=True) # 首先根据dtd得到一个parser(注意dtd文件要放在和xml文件相同的目录)
# tree = etree.parse('1.xml', parser=parser) # 用上面得到的parser将xml解析为树结构
data_list = []
pmid_set = []
for articles in tree.xpath('//PubmedArticle'):
# pmid = articles.xpath('MedlineCitation/PMID')[0].xpath('string()')
pmid = articles.xpath('MedlineCitation/PMID/text()')[0]
if pmid in pmid_set:
continue
pmid_set.append(pmid)
Article = articles.xpath('MedlineCitation/Article')[0]
journal = Article.xpath('Journal/ISOAbbreviation/text()')[0]
try:
authors = Article.xpath('AuthorList/Author')
affiliations_info = set()
for author in authors:
# author_name = author.find('LastName').text + ' ' + author.find('ForeName').text
affiliations = [x.xpath('Affiliation/text()')[0] for x in author.xpath('AffiliationInfo')]
# author = author_name + ':' + ';'.join(affiliations)
for affiliation in affiliations:
affiliations_info.add(affiliation)
affiliations_info = ';'.join(affiliations_info)
except AttributeError:
affiliations_info = ''
try:
date = Article.xpath('Journal/JournalIssue/PubDate/Year/text()')[0]
except IndexError:
date = Article.xpath('Journal/JournalIssue/PubDate/MedlineDate/text()')[0]
date = re.search('\d+', date).group(0)
try:
mesh_words = []
for mesh_heading in articles.xpath('MedlineCitation/MeshHeadingList/MeshHeading'):
if len(mesh_heading.xpath('child::*')) == 1:
mesh_words.append((mesh_heading.xpath('child::*'))[0].text)
continue
mesh_name = ''
for mesh in mesh_heading.xpath('child::*'):
if mesh.tag == 'DescriptorName':
mesh_name = mesh.xpath('string()')
continue
if mesh_name and mesh.tag == 'QualifierName':
mesh_word = mesh_name + '/' + mesh.xpath('string()')
mesh_words.append(mesh_word)
mesh_words = ';'.join(mesh_words)
except AttributeError:
mesh_words = ''
article_type = '/'.join([x.xpath('./text()')[0] for x in Article.xpath('PublicationTypeList/PublicationType')])
country = articles.xpath('MedlineCitation/MedlineJournalInfo/Country/text()')[0]
data_list.append(
{'PMID': pmid, 'journal': journal, 'affiliations_info': affiliations_info, 'pub_year': date,
'mesh_words': mesh_words,
'country': country, 'article_type': article_type, 'file_path': path})
print(pmid + '\t解析完成')
df = pd.DataFrame(data_list)
with threading.Lock():
df.to_csv('pubmed.csv', encoding='utf_8_sig', mode='a', index=False, header=False) def to_excel(data, path):
writer = pd.ExcelWriter(path)
data.to_excel(writer, sheet_name='table', index=False)
writer.save() def get_files_path():
for base_path, folders, files in os.walk('first in class drug'):
file_list = [os.path.join(base_path, file) for file in files if file.endswith('.xml')]
for base_path, folders, files in os.walk('follow on drug'):
file_list.extend([os.path.join(base_path, file) for file in files if file.endswith('.xml')])
for base_path, folders, files in os.walk('me too drug'):
file_list.extend([os.path.join(base_path, file) for file in files if file.endswith('.xml')])
if os.path.exists('pubmed.csv'):
df = pd.read_csv('pubmed.csv', encoding='utf-8')
has_files_list = df.file_path
print('共需解析文件:{0}'.format(len(file_list)))
file_list = set(file_list) - set(has_files_list)
print('已解析文件:{0}'.format(len(set(has_files_list))))
else:
df = pd.DataFrame(columns=['PMID','affiliations_info','article_type','country','file_path','journal','mesh_words','pub_year'])
df.to_csv('pubmed.csv', encoding='utf_8_sig', index=False)
print('共需解析文件:{0}'.format(len(file_list)))
print('已解析文件:0')
return file_list if __name__ == '__main__':
files_list = get_files_path()
if not files_list:
print('全部解析完成')
else:
pool = ThreadPoolExecutor(max_workers=os.cpu_count())
pool.map(pubmed_xpath_parse, files_list)
Python解析xml文档实战案例的更多相关文章
- python优秀库 - 使用xmltodict解析xml文档
上次讲到如何使用BeautifulSoup解析XML文档,今天发现另外一个python库xmltodict(https://github.com/martinblech/xmltodict)也很简单. ...
- Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...
- python+selenium自动化软件测试(第12章):Python读写XML文档
XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...
- 【转】Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
[转]Python之xml文档及配置文件处理(ElementTree模块.ConfigParser模块) 本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 ...
- 【学习笔记】关于DOM4J:使用DOM4J解析XML文档
一.概述 DOM4J是一个易用的.开源的库,用于XML.XPath和XSLT中.采用了Java集合框架并完全支持DOM.SAX.和JAXP. DOM4J最大的特色是使用大量的接口,主要接口都在org. ...
- 使用DOM解析XML文档
简单介绍一下使用DOM解析XML文档,解析XML文件案例: <?xml version="1.0" encoding="UTF-8"?> -< ...
- 精讲 org.w3c.dom(java dom)解析XML文档
org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 使用dom4j解析XML文档
dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...
随机推荐
- go get获取gitlab私有仓库的代码
目录 目录 1.Gitlab的搭建 2.如何通过go get,获取Gitlab的代码 目录 1.Gitlab的搭建 在上一篇文章中,已经介绍了如何搭建Gitlab Https服务<Nginx ...
- iBatis第一章:基础知识概述 & MVC思想
一.java是一门十分受开发人员欢迎的语言,在开发语言排行榜中名列前茅,人们对其看法不尽相同,就我自身感受而言,我觉得java语言的主要优势体现在如下几方面:1.java属于开源语言,开发人员可以找到 ...
- FelxCell常用属性设置(未完待续......)
this.grid1.AllowUserPaste//返回或设置是否允许用户粘贴文字和格式 grid1.Cell(Rows, 1).WrapText = true;//设置单元格自动换行
- mysql字段约束
为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目. 一. unique 唯一性约束 : 值不可重复: 二. not null 非空约束 : 值不可为空: 三. def ...
- [LeetCode] 20. 有效的括号
题目链接:https://leetcode-cn.com/problems/valid-parentheses/ 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串, ...
- 对多条件进行组合,生成笛卡尔积的用例集合的python代码实现
做专项测试需要对一些因素进行组合的测试,这里组合起来后数据量可能很大,我们可以用python来代劳 代码有优化空间,目前先用着. ************************代码开始******* ...
- ftp配置详解
FTP配置文件位置/etc/vsftpd.conflisten=NO设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以 ...
- LoRa---她的芯片和她的几种工作模式
LoRa对应的芯片------sx1278芯片 sx1278芯片为Semtech公司推出的具有新型LoRa扩频技术的RF芯片,具有功耗低.容量大.传输距离远.抗干扰能力强的优点.我接下来在这块芯片上进 ...
- css简单的一些基础知识
css层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可 ...
- Git使用(积累一些常用的命令)
1. 取消某一次合并 git merge --abort 可以参考的教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248 ...