【问题标题】:Extracting PubMed data in xml format from txt batches in Python从 Python 中的 txt 批次中提取 xml 格式的 PubMed 数据
【发布时间】:2022-01-03 01:12:54
【问题描述】:

我之前问过this question,这是一个完美的解决方案

下面是多个传统xml 文件的完美工作代码。

import pandas as pd
from glob import glob
from bs4 import BeautifulSoup

l = list()

for f in glob('*.xml'): # Changed to .txt here
    pub = dict()

    with open(f, 'r') as xml_file:
        xml = xml_file.read()

    soup = BeautifulSoup(xml, "lxml")
    pub['PMID'] = soup.find('pmid').text
    pub_list = soup.find('publicationtypelist')
    pub['Publication_type'] = list()
    for pub_type in pub_list.find_all('publicationtype'):
    pub['Publication_type'].append(pub_type.text)
    try:
        pub['NCTID'] = soup.find('accessionnumber').text
    except:
        pub['NCTID'] = None
    l.append(pub)

 df = pd.DataFrame(l)
 df = df.explode('Publication_type', ignore_index=True)

它给了我想要的输出

    PMID        Publication_type    NCTID
0   34963793    Journal Article     NCT02649218
1   34963793    Review              NCT02649218
2   34535952    Journal Article     None
3   34090787    Journal Article     NCT02424799
4   33615122    Journal Article     NCT01922037

此后我唯一改变的是 - 我提取了数据,using R and easyPubMed package。数据分批提取(每篇 100 篇文章),并以 xml 格式存储在 txt 文档中。我总共有 150 个 txt 文档。它现在只提取约 250 行,而不是约 25000 行。

当输入文件发生变化时,如何更新上面的 Python 代码并获得相同的输出?我add several txt files here 可重复性。需要提取PMIDPublication_typeNCTID

【问题讨论】:

  • @JayPeerachai,也许你可以再次在这里提供帮助?谢谢

标签: python xml web-scraping txt pubmed


【解决方案1】:

之前的代码只为单个文章的 XML 构建数据框,而不是数百篇文章的 XML。因此,您需要在 XML 中捕获每个 <PubmedArticle> 实例下的选择节点。现在每个 XML 中只捕获第一篇文章。

考虑一下 etree 的 iterparse 解决方案,该解决方案对读取大型 XML 的内存占用较少,您可以在 <PubmedArticle> 节点的打开和关闭之间提取所需的节点:

import pandas as pd
import xml.etree.ElementTree as ET

data =  []                               # INITIALIZE DATA LIST
for xml_file in glob('*.txt'):
    for event, elem in ET.iterparse(xml_file, events=('start', 'end')):
        if event == 'start':
            if elem.tag == "PubmedArticle":
                pub = {}                 # INITIALIZE ARTICLE DICT

            if elem.tag == 'PMID':
                pub["PMID"] = elem.text
                pub["PublicationType"] = []
                pub["NCTID"] = None

            elif elem.tag == 'PublicationType':
                pub["PublicationType"].append(elem.text)
                
            elif elem.tag == 'AccessionNumber':
                pub["NCTID"] = elem.text

        if event == 'end':
            if elem.tag == "PubmedArticle":
                pub["Source"] = xml_file
                data.append(pub)         # APPEND MULTIPLE ARTICLES

        elem.clear()

# BUILD XML DATA FRAME
final_df = (
    pd.DataFrame(data)
      .explode('PublicationType', ignore_index=True)
)

【讨论】:

  • 感谢您的宝贵时间,完美的解决方案。速度也很快,很棒!
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2017-10-17
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多