使用BeautifulSoup遍历XML以提取特定的标记并存储在variab中

2024-09-29 23:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我对编程还是个新手,一直在努力寻找解决方案,但我能找到的只是一些零碎的东西,没有真正的运气把它们放在一起。在

我试图在python中使用BeautifulSoup4来获取一些{}并将文本值存储在变量中特定标记之间。这些数据来自一个医学生培训项目,现在所有需要的东西都必须手动找到。所以我试着用一个刮削程序来提高效率。在

例如,我正在查看要进行实验的此类测试数据:

<AllergyList>
<Allergy>
    <Deleted>n</Deleted>
    <Status>
        <Active/>
    </Status>
    <ExternalID/>
    <Patient>
        <ExternalID/>
        <FirstName>Testcase</FirstName>
        <LastName>casetest</LastName>
    </Patient>
    <Allergen>
        <Name>Flagyl (metronidazole)</Name>
        <Drug>
           <NDCID>00025182151,00025182131,00025182150</NDCID>
        </Drug>
    </Allergen>
    <Reaction>difficulty breathing</Reaction>
    <OnsetDate>02/02/2013</OnsetDate>
 </Allergy>
<Allergy>
    <Deleted>n</Deleted>
    <Status>
        <Active/>
    </Status>
    <ExternalID/>
    <Patient>
        <ExternalID/>
        <FirstName>Testcase</FirstName>
        <LastName>casetest</LastName>
    </Patient>
    <Allergen>
        <Name>Bactrim (sulfamethoxazole-trimethoprim)</Name>
        <Drug>
            <NDCID>13310014501,49999023220</NDCID>
        </Drug>
    </Allergen>
    <Reaction>swelling</Reaction>
    <OnsetDate>05/03/2002</OnsetDate>
  </Allergy>
  <Number>2</Number>
</AllergyList>

我一直在尝试从多个<Allergen>标记之间的中间提取<Name>标记,以及{}和{}标记之间的相应数据,同时将拉取的结果存储到各自的变量中。在

例如,我想拉Flagyl (metronidazole)difficulty breathing02/02/2013,然后Bactrim (sulfamethoxazole-trimethoprim)swelling05/03/2002,依此类推,同时将它们放在单独的变量中,以便以后使用。在

<Allergen>标记提取第一个集合很容易,但是我很难理解如何迭代xml并将提取的数据存储到变量中。在将数据存储到数组或列表中时,我一直在尝试使用for循环,但是我编写它的方式总是根据我从len()函数计算的迭代次数,一遍又一遍地提取相同的数据,但后来都没能将其存储到数组中。在

我为此绞尽脑汁已经有一段时间了,我想我可能不是那么聪明,所以任何帮助,甚至指点我正确的方向都将是非常感谢的。在


Tags: 数据name标记statusfirstnamelastnamepatientdrug
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:39

这似乎是一项简单的任务,因为嵌套标记不多:

from bs4 import BeautifulSoup
import sys 

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'xml')

allergies = []
for allergy in soup.find_all('Allergy'):
    d = { 
        'name': allergy.Allergen.Name.string,
        'reaction': allergy.Reaction.string,
        'on_set_date': allergy.OnsetDate.string,
    }   
    allergies.append(d)

## Use 'allergies' array of dictionaries as you want.
## Example:
print(allergies[1]['reaction'])

使用xml文件作为参数运行它:

^{pr2}$

这个测试得出:

swelling

相关问题 更多 >

    热门问题