使用 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>
我一直在尝试从多个<Allergen>
标签之间提取<Name>
标签以及<Onsetdate>
和<Reaction>
标签之间的相应数据,同时将拉取结果存储到相应的标签中变量。
例如,我想提取Flagyl (metronidazole)
、difficulty breathing
、02/02/2013
,然后是Bactrim (sulfamethoxazole-trimethoprim)
、swelling
、05/03/2002
等等,同时将它们放在单独的变量中,以便以后使用.
从<Allergen>
标记中提取第一组很容易,但我无法弄清楚如何迭代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解析,命名空间问题
Python爬虫教程-24-数据提取-BeautifulSoup4