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

Posted

技术标签:

【中文标题】使用 BeautifulSoup 迭代 XML 以提取特定标签并存储在变量中【英文标题】:Use BeautifulSoup to Iterate over XML to pull specific tags and store in variable 【发布时间】:2013-11-20 14:33:22 【问题描述】:

我对编程还很陌生,一直在努力寻找解决方案,但我只能找到零碎的东西,没有真正的运气将它们放在一起。

我正在尝试使用python 中的BeautifulSoup4 来抓取一些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>

我一直在尝试从多个&lt;Allergen&gt; 标签之间提取&lt;Name&gt; 标签以及&lt;Onsetdate&gt;&lt;Reaction&gt; 标签之间的相应数据,同时将拉取结果存储到相应的标签中变量。

例如,我想提取Flagyl (metronidazole)difficulty breathing02/02/2013,然后是Bactrim (sulfamethoxazole-trimethoprim)swelling05/03/2002 等等,同时将它们放在单独的变量中,以便以后使用.

&lt;Allergen&gt; 标记中提取第一组很容易,但我无法弄清楚如何迭代xml 并将提取的数据存储到变量中。我一直在尝试使用 for 循环,同时将数据存储到数组或列表中,但是我一直在编写它的方式,我总是根据我从 @987654339 计算的迭代次数一遍又一遍地提取相同的数据@ 函数,此后未能将其中任何一个存储到数组中。

我为此绞尽脑汁已经有一段时间了,我认为我可能没有那么聪明,因此非常感谢任何帮助甚至为我指明正确的方向。

【问题讨论】:

看看***.com/questions/5530857/…和***.com/questions/418497/… 【参考方案1】:

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

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 文件作为参数运行它:

python3 script.py xmlfile

这个测试产生:

swelling

【讨论】:

哇,这么简单,它就成功了。我以前没有想过使用字典。我是编程新手,对 BeautifulSoup 不太熟悉,所以这很有帮助!

以上是关于使用 BeautifulSoup 迭代 XML 以提取特定标签并存储在变量中的主要内容,如果未能解决你的问题,请参考以下文章

使用beautifulsoup4进行xml解析,命名空间问题

使用 BeautifulSoup 创建 XML 文档

BeautifulSoup 在迭代器上执行 find()

Python爬虫教程-24-数据提取-BeautifulSoup4

如何使用 BeautifulSoup 访问命名空间的 XML 元素?

python 使用BeautifulSoup解析XML