【问题标题】:在 Python 中从 PubMed xml 中提取 pmid、nct_id 和发布类型
【发布时间】:2022-01-22 18:27:08
【问题描述】:

我尝试从这样的 xml 文件中提取 pmid、nct_id 和发布类型。四个样本文件是here,一个有NCT_ID。

<PMID Version="1">144418</PMID>
<PublicationType UI="D016428">Journal Article</PublicationType>
<AccessionNumber>NCT03070782</AccessionNumber>

理想情况下,我想要一个 pd 数据框:

预期输出:

PMID    Publication_type  NCTID
1       Journal article   NCT03070782
2       Journal article   NaN
3       Journal article   NaN

但如果有人至少可以告诉如何提取 1 个文件,我也将不胜感激!我会弄清楚如何将其放入数据框中。

【问题讨论】:

标签: python pandas xml web-scraping


【解决方案1】:
  • 使用glob 遍历所有 XML 文件

  • 使用BeautifulSoup解析XML内容

  • 使用 soup.find()soup.find_all() 在 XML 中查找元素

  • 使用.text()从元素下的文本节点获取字符串

  • 使用tryexcept 处理异常NCTID

  • 将内容存储为dict 并附加到list

  • 使用pd.DataFrame(&lt;list&gt;) 从给定的list 创建dataframe

  • 请注意,每个PMID 可能包含多个Publication_type,因此,使用explode()Publication_type 的列表拆分为引用PMID 的多行

代码:

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

l = list()

for f in glob('*.xml'):
    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   144418  Journal Article     None
>     1   272056  English Abstract    None
>     2   272056  Journal Article     None
>     3   349115  Editorial   None
>     4   349115  Historical Article  None
>     5   31893580    Clinical Trial, Phase II    NCT03070782
>     6   31893580    Journal Article NCT03070782
>     7   31893580    Multicenter Study   NCT03070782
>     8   31893580    Randomized Controlled Trial NCT03070782
>     9   31893580    Research Support, Non-U.S. Gov't    NCT03070782

【讨论】:

  • 谢谢,非常乐意提供帮助。
  • Jay,我可以再问一个问题吗?很少有文章具有临床试验的 NCT id。对于 13000 个 xml 文件,我有大约 50 个。你将如何提取这个,把 NaN 放在没有这样数字的文章中
  • 我更新了问题并将此类文件上传到文件夹
  • 我上传了nctidfile.xml之类的文件到文件夹中。非常感谢您的帮助
  • @AnakinSkywalker,要处理NCTID,您可以使用tryexpect。我已经更新了答案,请看。希望能满足您的需求。
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2017-03-05
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多