首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >条件查询(混合标记和属性)解析

条件查询(混合标记和属性)解析
EN

Stack Overflow用户
提问于 2022-06-18 01:41:00
回答 2查看 44关注 0票数 1

我有两个版本的XML文件,我需要从中提取内容。两种格式的信息都相同,如下所示(不仅有不同的标记,而且有不同的结构):

第一个元素在:<inactiveelementSubstance></inactiveelementSubstance>

  • The和<element classCode="ACTIM"></element classCode="ACTIM">

之间定义了活动元素和非活动元素,第二个元素在:<element classCode="IACT"></element classCode="IACT">

  • 之间定义了活动和非活动元素。

如何解决这两种情况来提取非活动元素和活动元素? (有几个标记有同义词的例子,但我没有看到任何实际结构与本例不同的地方)。

我从第二种情况(提取元素及其代码)中提取了以下代码(不太干净):

代码语言:javascript
运行
复制
activeElements = soup.findAll('Element', attrs={'classCode': 'ACTIM'})
for i in activeElements:
    aiName = i.find('name')
    aiCode = str(i.find('code'))
    print(aiName.text)
    print( re.findall(r'"(.*?)"', aiCode)[0] )


print('\nInactive Elements\n')

inactiveElements = soup.findAll('Element', attrs={'classCode': 'IACT'})
for i in inactiveElements:
    aiName = i.find('name')
    print(aiName.text)
    aiCode = i.find('code')['code']
    print(aiCode)

XML文件的示例如下:

第一类(格式为<element classCode="IACT"></element classCode="IACT"><element classCode="ACTIM"></element classCode="ACTIM">):

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<document>
<manufacturedProduct>
<element classCode="IACT">
<elementSubstance>
<code code="36SFW2JZ" codeSystem="33590coding"/>
<name>HYPROMELLOSE 2910 (15 MPA.S)</name>
</elementSubstance>
</element>
<element classCode="IACT">
<elementSubstance>
<code code="70097M6I" codeSystem="33590coding"/>
<name>MAGNESIUM STEARATE</name>
</elementSubstance>
</element>
<elementSubstance>
<code code="XHX3C3X6" codeSystem="33590coding"/>
<name>TRIACETIN</name>
</elementSubstance>
</element>
<element classCode="ACTIM">
<quantity>
<numerator unit="mg" value="250"/>
<denominator unit="1" value="1"/>
</quantity>
<elementSubstance>
<code code="JTE4MNN1" codeSystem="33590coding"/>
<name>AZITHROMYCIN MONOHYDRATE</name>
</elementSubstance>
</element>
</manufacturedProduct>
</document>

第二类(格式为<activeelementSubstance></activeelementSubstance><inactiveelementSubstance></inactiveelementSubstance>):

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<document>
<manufacturedProduct>
<activeelementSubstance>
<code code="VB0R961H" codeSystem="33590coding" codeSystemName="USDA" />
<name>Prednisone</name>
</activeelementSubstance>
</activeelement>
<inactiveelement>
<inactiveelementSubstance>
<code code="776XM704" codeSystem="33590coding" codeSystemName="USDA" />
<name>calcium stearate</name>
</inactiveelementSubstance>
</inactiveelement>
<inactiveelement>
<inactiveelementSubstance>
<name>corn starch</name>
</inactiveelementSubstance>
</inactiveelement>
</manufacturedProduct>
</document>

XML文件是深嵌套的(这也是我使用“美丽汤”的部分原因),我试着清理和提取其中的相关部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-18 06:53:00

您可以在,中使用CSS选择器。例如:

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

xml_doc1 = ...version 1 of the xml document...
xml_doc2 = ...version 2 of the xml document...


soup = BeautifulSoup(xml_doc1 + xml_doc2, "html.parser")

elem = soup.select(
    'element[classCode="IACT"], element[classCode="ACTIM"], activeelementSubstance, inactiveelementSubstance'
)

for e in elem:
    code = c["code"] if (c := e.code) else "-"
    name = n.text if (n := e.find("name")) else "-"

    print(code, name)

指纹:

代码语言:javascript
运行
复制
36SFW2JZ HYPROMELLOSE 2910 (15 MPA.S)
70097M6I MAGNESIUM STEARATE
JTE4MNN1 AZITHROMYCIN MONOHYDRATE
VB0R961H Prednisone
776XM704 calcium stearate
- corn starch

或分裂为活动和不活跃:

代码语言:javascript
运行
复制
print("Active Elements")

elem = soup.select('element[classCode="ACTIM"], activeelementSubstance')

for e in elem:
    code = c["code"] if (c := e.code) else "-"
    name = n.text if (n := e.find("name")) else "-"

    print(code, name)


print("\nInactive Elements")

elem = soup.select('element[classCode="IACT"], inactiveelementSubstance')

for e in elem:
    code = c["code"] if (c := e.code) else "-"
    name = n.text if (n := e.find("name")) else "-"

    print(code, name)
票数 1
EN

Stack Overflow用户

发布于 2022-06-18 06:15:32

您可以在CSS选择器列表中使用CSS或语法,而不是添加条件逻辑来确定在何处分配提取的结果。下面可以使用重构来减少嵌套,例如将某些部分移动到它们自己的功能中,但它给出了一个起点。

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup as bs

type_1 = '''
<?xml version="1.0" encoding="UTF-8"?>
<document>
<manufacturedProduct>
<element classCode="IACT">
<elementSubstance>
<code code="36SFW2JZ" codeSystem="33590coding"/>
<name>HYPROMELLOSE 2910 (15 MPA.S)</name>
</elementSubstance>
</element>
<element classCode="IACT">
<elementSubstance>
<code code="70097M6I" codeSystem="33590coding"/>
<name>MAGNESIUM STEARATE</name>
</elementSubstance>
</element>
<elementSubstance>
<code code="XHX3C3X6" codeSystem="33590coding"/>
<name>TRIACETIN</name>
</elementSubstance>
</element>
<element classCode="ACTIM">
<quantity>
<numerator unit="mg" value="250"/>
<denominator unit="1" value="1"/>
</quantity>
<elementSubstance>
<code code="JTE4MNN1" codeSystem="33590coding"/>
<name>AZITHROMYCIN MONOHYDRATE</name>
</elementSubstance>
</element>
</manufacturedProduct>
</document>'''

type_2 = '''
<?xml version="1.0" encoding="UTF-8"?>
<document>
<manufacturedProduct>
<activeelementSubstance>
<code code="VB0R961H" codeSystem="33590coding" codeSystemName="USDA" />
<name>Prednisone</name>
</activeelementSubstance>
</activeelement>
<inactiveelement>
<inactiveelementSubstance>
<code code="776XM704" codeSystem="33590coding" codeSystemName="USDA" />
<name>calcium stearate</name>
</inactiveelementSubstance>
</inactiveelement>
<inactiveelement>
<inactiveelementSubstance>
<name>corn starch</name>
</inactiveelementSubstance>
</inactiveelement>
</manufacturedProduct>
</document>'''


results = {'active': [], 'inactive': []}

for doc in [type_1, type_2]:
    
    soup = bs(doc, 'lxml')
    
    for i in soup.select('[classcode=IACT], [classcode=ACTIM], activeelement, inactiveelement'):

        if i.get('classcode') == 'IACT' or i.name == 'inactiveelement':
            try:
                d = {i.select_one('name').text:i.select_one('code')['code']}
            except:
                d = {i.select_one('name').text:'missing'}
            results['inactive'].append(d)
        else:
            results['active'].append({i.select_one('name').text:i.select_one('code')['code']})
            
print(results)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72666120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档