Разбор XML в Python 3.x - PullRequest
       24

Разбор XML в Python 3.x

0 голосов
/ 24 апреля 2019

У меня есть некоторый XML-код, который я хочу проанализировать.Я хочу использовать ElementTree, а не BeautifulSoup, так как у меня возникают некоторые проблемы с последним при работе с XML.

Я хочу извлечь текст из следующего:

  • Аннотация/ AbstractText
  • ArticleId когда IdType = "pmc"
  • PublicationType со значением 'UI', который должен быть извлечен первым перед извлечением соответствующего текста

Какие функции ElementTree выполняютЯ использую, чтобы сделать работу?

Я пытался использовать .attrib, attrib.get(), .iter, .attrib[key], чтобы получить текст, но мне не удалось получить доступ к фактическому тексту.

<PubmedArticleSet>
   <PubmedArticle>
       <PMID Version="1">10890875</PMID>
       <Journal>
           <ISSN IssnType="Print">0143-005X</ISSN>
            <Title>Journal of epidemiology and community health</Title>
       </Journal>
       <ArticleTitle>Sources of influence on medical practice. 
       </ArticleTitle>
       <Abstract>
          <AbstractText Label="OBJECTIVES" NlmCategory="OBJECTIVE">
             To explore the opinion of general practitioners on the 
             importance and legitimacy of sources of influence on 
             medical practice.
          </AbstractText>
          <AbstractText Label="METHODS" NlmCategory="METHODS">
             General practitioners (n=723) assigned to Primary Care 
             Teams (PCTs) in two Spanish regions were randomly selected 
             to participate in this study. 
          </AbstractText>
          <AbstractText Label="RESULTS" NlmCategory="RESULTS">
The most important and legitimate sources of influence according to general practitioners were: training courses and scientific articles, designing self developed protocols and discussing with colleagues. 
          </AbstractText>
          <AbstractText Label="CONCLUSIONS" NlmCategory="CONCLUSIONS">
The development of medical practice is determined by many factors, grouped around three big areas: organisational setting, professional system and social setting. </AbstractText>
        </Abstract>
        <Language>eng</Language>
        <PublicationTypeList>
           <PublicationType UI="D016428">Journal Article 
           </PublicationType>
           <PublicationType UI="D013485">Research Support, Non-U.S.Gov't </PublicationType>
        </PublicationTypeList>
    <PubmedData>
         <PublicationStatus>ppublish</PublicationStatus>
         <ArticleIdList>
            <ArticleId IdType="pubmed">10890875</ArticleId>
            <ArticleId IdType="pmc">PMC1731730</ArticleId>
         </ArticleIdList>
     </PubmedData>
   </PubmedArticle>
</PubmedArticleSet>

То, что я надеюсь получить в результате: генерирование каждого «ярлыка» AbstractText с получением текста для этого «ярлыка»

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Попробуйте следующий код с Css Selector.

from bs4 import BeautifulSoup

html='''<PubmedArticleSet>
   <PubmedArticle>
       <PMID Version="1">10890875</PMID>
       <Journal>
           <ISSN IssnType="Print">0143-005X</ISSN>
            <Title>Journal of epidemiology and community health</Title>
       </Journal>
       <ArticleTitle>Sources of influence on medical practice. 
       </ArticleTitle>
       <Abstract>
          <AbstractText Label="OBJECTIVES" NlmCategory="OBJECTIVE">
             To explore the opinion of general practitioners on the 
             importance and legitimacy of sources of influence on 
             medical practice.
          </AbstractText>
          <AbstractText Label="METHODS" NlmCategory="METHODS">
             General practitioners (n=723) assigned to Primary Care 
             Teams (PCTs) in two Spanish regions were randomly selected 
             to participate in this study. 
          </AbstractText>
          <AbstractText Label="RESULTS" NlmCategory="RESULTS">
The most important and legitimate sources of influence according to general practitioners were: training courses and scientific articles, designing self developed protocols and discussing with colleagues. 
          </AbstractText>
          <AbstractText Label="CONCLUSIONS" NlmCategory="CONCLUSIONS">
The development of medical practice is determined by many factors, grouped around three big areas: organisational setting, professional system and social setting. </AbstractText>
        </Abstract>
        <Language>eng</Language>
        <PublicationTypeList>
           <PublicationType UI="D016428">Journal Article 
           </PublicationType>
           <PublicationType UI="D013485">Research Support, Non-U.S.Gov't </PublicationType>
        </PublicationTypeList>
    <PubmedData>
         <PublicationStatus>ppublish</PublicationStatus>
         <ArticleIdList>
            <ArticleId IdType="pubmed">10890875</ArticleId>
            <ArticleId IdType="pmc">PMC1731730</ArticleId>
         </ArticleIdList>
     </PubmedData>
   </PubmedArticle>
</PubmedArticleSet>'''

soup = BeautifulSoup(html, 'lxml')

maintag=soup.select_one('Abstract')
for childtag in maintag.select('AbstractText'):
    print(childtag.text.strip())

print(soup.select_one('ArticleId[IdType="pmc"]').text)

Выход:

To explore the opinion of general practitioners on the 
             importance and legitimacy of sources of influence on 
             medical practice.
General practitioners (n=723) assigned to Primary Care 
             Teams (PCTs) in two Spanish regions were randomly selected 
             to participate in this study.
The most important and legitimate sources of influence according to general practitioners were: training courses and scientific articles, designing self developed protocols and discussing with colleagues.
The development of medical practice is determined by many factors, grouped around three big areas: organisational setting, professional system and social setting.
PMC1731730
0 голосов
/ 05 мая 2019

В общем, я отлично использовал метод .find () для просмотра XML-файлов, которые были проанализированы с помощью ElementTree. И затем для всего, что вы найдете, вы можете использовать element.text, element.attrib и element.tag, чтобы получить текст, словарь атрибутов и имя элемента соответственно.

Объедините это с пониманием списка, и это звучит так, как будто вы ищете.

В качестве примера предположим, что у вас есть xml-файл, сохраненный как 'publishing.xml':

import xml.etree.ElementTree as ET

filename = 'publications.xml'
content = ET.parse(filename)
root = content.getroot()

abstracts = [a.text for a in root.find('PubmedArticle/Abstract')]

даст вам список текста в 4 тезисах.

Доступ ко всем идентификаторам можно выполнить аналогичным образом, добавив проверку правильности IdType. С помощью метода, упомянутого выше, вы можете аналогичным образом получить список всех элементов с именем ArticleId и затем получить доступ к IdType, используя

element.attrib['IdType']

для каждого элемента в данном списке.

Что касается последнего запроса, я не совсем уверен, что вы имеете в виду, когда сначала извлекаете значение UI. Если вы просто хотите убедиться, что вы извлекаете оба значения, вы можете перебрать все элементы в

root.find('PubmedArticle/PublicationTypeList')

и сохраните как element.attrib ['UI'], так и element.text

...