使用BeautifulSoup迭代XML以提取特定标记并存储在变量中

use*_*206 5 python xml variables loops beautifulsoup

我对编程很新,并且一直试图为此找到解决方案,但我能找到的只是点点滴滴而没有真正的运气将它们放在一起.

我想用BeautifulSoup4python刮一些xml并存储在变量的特定标记之间的文本值.这些数据来自医学生培训计划,现在所需的一切都必须手动找到.所以我试图通过抓取程序来提高效率.

比方说,我正在研究这种类型的测试数据来试验:

<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>
Run Code Online (Sandbox Code Playgroud)

我一直试图<Name>从多个<Allergen>标签之间拉出标签以及从标签<Onsetdate><Reaction>标签之间的相应数据,同时将拉结果存储到各自的变量中.

因此,例如,我会想拉Flagyl (metronidazole),difficulty breathing,02/02/2013,然后Bactrim (sulfamethoxazole-trimethoprim),swelling,05/03/2002,等,同时将它们放置在不同的变量,我可以在以后使用.

<Allergen>标签中拉出第一组很容易,但我无法弄清楚如何迭代xml并将拉出的数据存储到变量中.我一直在尝试使用for循环,同时将数据存储到数组或列表中但是我一直在编写它的方式我总是反复地拉取相同的数据,这取决于我从len()函数计算的迭代次数和从那以后没能将它们存储到一个数组中.

我一直在讨论这个问题已经有一段时间了,我想我可能不会那么聪明,所以任何帮助甚至指向正确的方向都会非常感激.

Bir*_*rei 7

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

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'])
Run Code Online (Sandbox Code Playgroud)

xml文件作为参数运行它:

python3 script.py xmlfile
Run Code Online (Sandbox Code Playgroud)

而这个测试产生:

swelling
Run Code Online (Sandbox Code Playgroud)