Dieser Artikel ist eine persönliche Anmerkung zur Verwendung von Python zum Lesen der Literaturdaten (XML-Format), die bei einer Suche in Pubmed erfasst wurden.
Ich würde mich freuen, wenn Sie auf Punkte hinweisen könnten, die Ihnen aufgefallen sind.
Ein Datenelement sieht wie folgt aus. Eigentlich möchte ich mehrere Daten verarbeiten, aber zuerst werde ich es möglich machen, eine nach der anderen zu verarbeiten.
001.xml
<PubmedArticle>
<MedlineCitation Status="Publisher" Owner="NLM">
<PMID Version="1">12345678</PMID>
<DateRevised>
<Year>2020</Year>
<Month>03</Month>
<Day>27</Day>
</DateRevised>
<Article PubModel="Print-Electronic">
<Journal>
<ISSN IssnType="Electronic">1873-3700</ISSN>
<JournalIssue CitedMedium="Internet">
<PubDate>
<Year>2020</Year>
<Month>Mar</Month>
</PubDate>
</JournalIssue>
<Title>Journal of XXX</Title>
</Journal>
<ArticleTitle>Identification of XXX.</ArticleTitle>
<AuthorList CompleteYN="Y">
<Author ValidYN="Y">
<LastName>Sendai</LastName>
<ForeName>Shiro</ForeName>
<Initials>S</Initials>
<AffiliationInfo>
<Affiliation>Sendai, Japan.</Affiliation>
</AffiliationInfo>
</Author>
<Author ValidYN="Y">
<LastName>Tohoku</LastName>
<ForeName>Taro</ForeName>
<Initials>T</Initials>
<AffiliationInfo>
<Affiliation>Miyagi, Japan.</Affiliation>
</AffiliationInfo>
</Author>
</AuthorList>
<Language>eng</Language>
<PublicationTypeList>
<PublicationType UI="D016428">Journal Article</PublicationType>
</PublicationTypeList>
<ArticleDate DateType="Electronic">
<Year>2020</Year>
<Month>03</Month>
<Day>23</Day>
</ArticleDate>
</Article>
<CitationSubset>IM</CitationSubset>
</MedlineCitation>
<PubmedData>
<PublicationStatus>aheadofprint</PublicationStatus>
<ArticleIdList>
<ArticleId IdType="pubmed">32213359</ArticleId>
<ArticleId IdType="pii">S0031-9422(19)30971-9</ArticleId>
<ArticleId IdType="doi">10.1016/j.phytochem.2020.112349</ArticleId>
</ArticleIdList>
</PubmedData>
</PubmedArticle>
Laden Sie die Bibliothek zum Lesen von XML.
001.py
import xml.etree.ElementTree as ET
Lesen Sie XML-Daten aus der Datei. Es scheint, dass mehrere Daten mit zwei Zeilenumbrüchen ausgerichtet sind. Teilen Sie sie daher in eine Liste auf.
002.py
test_data = open("./xxxx/pubmed.xml", "r")
contents = test_data.read()
records = contents.split('\n\n')
Die ersten Dokumentdaten (Datensätze [0]) werden von ET.fromstring () gelesen und im Variablenstamm gespeichert. Wenn Sie root mit type () betrachten, werden Sie feststellen, dass es sich um ein Element-Objekt handelt.
003.py
root = ET.fromstring(records[0])
type(root)
#<class 'xml.etree.ElementTree.Element'>
Sie können das Tag mit root.tag überprüfen. Ich werde es prüfen.
004.py
root.tag
#'PubmedArticle'
Grob gesagt haben Daten die folgende Form. Ich konnte mit root.tag auf das äußerste Tag zugreifen.
002.xml
<PubmedArticle>
<MedlineCitation>
</MedlineCitation>
<PubmedData>
</PubmedData>
</PubmedArticle>
In \ <PubmedArticle > befinden sich zwei Elemente (MedlineCitation und PubmedData), auf die über Indizes zugegriffen werden kann. Greifen Sie mit Indizes zu und suchen Sie den Typ weiter.
005.py
root[0]
#<Element 'MedlineCitation' at 0x10a9d5b38>
type(root[0])
#<class 'xml.etree.ElementTree.Element'>
root[1]
#<Element 'PubmedData' at 0x10aa78868>
type(root[1])
#<class 'xml.etree.ElementTree.Element'>
Sie können sehen, dass beide Elementobjekte sind.
Kurz gesagt, es scheint, dass alle Knoten Elementobjekte sind. Elementobjekte können iteriert und untergeordnete Knoten einzeln abgerufen und verarbeitet werden.
for i in root:
print(i.tag)
Element-Tags können in .tag nachgeschlagen werden, und .attrib kann die Attribute und Attributwerte nachschlagen, die diesem Tag zugeordnet sind.
root[0].tag
#'MedlineCitation'
root[0].attrib
#{'Status': 'Publisher', 'Owner': 'NLM'}
# root[0]Das Tag um ist wie folgt.
# <MedlineCitation Status="Publisher" Owner="NLM">
type(root[0].attrib)
#<class 'dict'> #Wörterbuchklasse
Es werden wahrscheinlich drei sein. In jedem Fall können Sie ein oder mehrere Tags angeben. Schließen Sie das gesamte Tag in Anführungszeichen ein. Trennen Sie die Tags bei der Angabe mehrerer Tags durch einen Schrägstrich.
Wenn es 1 ist, wird das Element-Objekt zurückgegeben, wenn es 2 ist, wird die Liste der Element-Objekte zurückgegeben, und wenn es 3 ist, ist es ein Objekt für die Iteration? Wird zurückgegeben. Ich werde es prüfen.
root.find('MedlineCitation/DateRevised/Year')
#<Element 'Year' at 0x10a9f8ae8>
root.findall('MedlineCitation')
#[<Element 'MedlineCitation' at 0x10a9d5b38>]
root.iter('Author')
#<_elementtree._element_iterator object at 0x10aa65990>
#Lassen Sie uns mit der for-Anweisung iterieren.
for i in root.iter('Author'):
print(i)
#<Element 'Author' at 0x10aa6e9f8>
#<Element 'Author' at 0x10aa6ec28>
Es scheint, dass findall () nur die untergeordneten Knoten des Element-Objekts und iter () alle untergeordneten Knoten, Enkelknoten, Urenkelknoten ... des Element-Objekts betrachtet.
Das Element-Objekt hat zwei Werte. Attributwert und Textdaten. Attributwerte können mit .get ('* Eigenschaftsname ') für Elementobjekte abgerufen werden. Alternativ scheint .attrib [' Eigenschaftsname *'] in Ordnung zu sein.
#.get()Oder
root.find('MedlineCitation').get('Status')
#'Publisher'
#.attrib()Oder
root.find('MedlineCitation').attrib['Status']
#'Publisher'
Sie können Textdaten auch abrufen, indem Sie .text für das Element-Objekt verwenden.
Die Textdaten hier sind der Teil, der im folgenden Beispiel von Tags 2020 umgeben ist. <Year>2020</Year>
Versuchen Sie, den Wert zu ermitteln, indem Sie mit find () den Pfad zum Element-Objekt angeben.
root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year').text
#'2020'
Um Informationen über mehrere Autoren zu erhalten, durchlaufen Sie die mit findall () erhaltene Liste.
Korrigiert unter Berücksichtigung mehrerer Autorenzugehörigkeiten (31. März 2020).
for x in root.findall('MedlineCitation/Article/AuthorList/Author'):
x.find('LastName').text #Nachname des Autors
x.find('ForeName').text #Name des Autors
for y in x.findall('AffiliationInfo'):
y.find('Affiliation').text
Die doi (Dokumentkennung) ist im Tag ELocationID beschrieben, aber das Tag ELocationID hat einige Attributwerte, und im Fall von EIdType = "doi" müssen die Textdaten abgerufen werden.
for x in root.findall('MedlineCitation/Article/ELocationID'):
if(x.get('EIdType') == 'doi'):
x.text
Es muss unterschieden werden, ob es sich bei dem Datensatz um eine Rezension oder einen Zeitschriftenartikel handelt, der im Publikationstyp beschrieben ist. Es gibt jedoch normalerweise mehrere Veröffentlichungstypen, und wenn einer von ihnen den Wert "Überprüfung" hat, scheint es sich um "Überprüfung" zu handeln.
Wenn Sie sich beispielsweise den Überprüfungsdatensatz ansehen, sieht er folgendermaßen aus:
.xml
<PublicationTypeList>
<PublicationType UI="D016428">Journal Article</PublicationType>
<PublicationType UI="D016454">Review</PublicationType>
<PublicationType UI="D013485">Research Support, Non-U.S. Gov't</PublicationType>
</PublicationTypeList>
Also, ob es sich um eine Bewertung handelt oder nicht
isReview = False
for x in root.findall('MedlineCitation/Article/PublicationTypeList'):
if (x.text == 'Review'):
isReview = TRUE
Ich finde es gut, das zu tun.
Um das oben Gesagte zusammenzufassen, einschließlich anderer Informationen, die Sie möglicherweise erhalten möchten
import xml.etree.ElementTree as ET
test_data = open("./pubmed.xml", "r")
contents = test_data.read()
records = contents.split('\n\n')
root = ET.fromstring(records[0])#Vorerst nur der erste Fall.
#Informationen zum Autor
for x in root.findall('MedlineCitation/Article/AuthorList/Author'):
x.find('LastName').text #Nachname des Autors
x.find('ForeName').text #Name des Autors
for y in x.findall('AffiliationInfo'):
y.find('Affiliation').text#Fest.
#Beurteilung, ob es sich um eine Überprüfung handelt
isReview = False
for x in root.findall('MedlineCitation/Article/PublicationTypeList'):
if (x.text == 'Review'):
isReview = TRUE
# doi
for x in root.findall('MedlineCitation/Article/ELocationID'):
if(x.get('EIdType') == 'doi'):
x.text
#PMID
root.find('MedlineCitation/PMID').text
#Papiertitel
root.find('MedlineCitation/Article/ArticleTitle').text
#Journalname
root.find('MedlineCitation/Article/Journal/Title').text
#Veröffentlichungsjahr
root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year').text
#Erscheinungsmonat
root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Month').text
#Sprache
root.find('MedlineCitation/Article/Language').text
Ich denke, es sollte getan werden. Im obigen Code gibt es nur einen Prozess:
for record in records:
root = ET.fromstring(record)
#Beschreiben Sie den Prozess
Sie sollten es als tun.
Wenn Sie nun über XML-Daten verfügen, können Sie die erforderlichen Informationen sofort extrahieren. Alles, was Sie tun müssen, ist darüber nachzudenken, wie Sie es gestalten können.
Jetzt wissen Sie, wie Sie mit XML-Daten umgehen.
Recommended Posts