从BeautifulSoup xml中提取属性“值”

时间:2019-05-29 22:55:46

标签: xml python-3.x beautifulsoup

我正在尝试使用BeautifulSoup从SOAP xml schema中提取搜索关键字,但无法弄清楚如何提取值属性。

我尝试使用soap.find_all,但是它不允许我提取value属性。

这是我到目前为止所拥有的:

soap = requests.get('http://ecp.iedadata.org/soap_search_schema.xsd')
soapXML = soap.content.decode("utf-8")
soapSoup = BeautifulSoup(soapXML, "xml")
level1 = soapSoup.findAll('xs:attribute', {'name':'level1'})[0]
level1['value']

这是我遇到的问题。根据BeautifulSoup文档,这应该输出所有“值”属性。

print(level1):

<xs:attribute name="level1" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
<xs:enumeration value="alteration"/>
<xs:enumeration value="igneous"/>
<xs:enumeration value="metamorphic"/>
<xs:enumeration value="notfound"/>
<xs:enumeration value="ore"/>
<xs:enumeration value="sedimentary"/>
<xs:enumeration value="vein"/>
<xs:enumeration value="xenolith"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>

因此,正如您所看到的,我正在尝试从所有xs:enumeration标签的value属性中获取文本。最终结果将是第1级的搜索字词列表。即:

(蚀变,火成,变质,未发现,矿石,沉积物,脉,异岩)

我不能只调用xs:enumeration标记,因为有多个关键字(例如,level2,level3,SampleType等),并且每个关键字都有不同的xs:enumeration值。

这是最后一行(level1 ['value'])上的错误

  
     

KeyError跟踪(最近一次通话最近)    在   ----> 1 level1test ['value']

      getitem 中的

〜/ anaconda3 / envs / py37 / lib / python3.7 / site-packages / bs4 / element.py(自身,密钥)      1069“”“ tag [key]返回标签的'key'属性值,      1070,如果不存在则抛出异常。   -> 1071返回self.attrs [key]      1072      1073 def iter (自己):

     

KeyError:'值'

2 个答案:

答案 0 :(得分:0)

只需将level1['value']替换为:

for i in level1:
    if type(i) is not bs4.element.NavigableString:
        data = i.contents
        for k in data[1]:
            if type(k) is not bs4.element.NavigableString:
                print(k['value'])

输出:

alteration
igneous
metamorphic
notfound
ore
sedimentary
vein
xenolith

答案 1 :(得分:0)

只需使用 attribute selector

import requests 
from bs4 import BeautifulSoup as bs

soap = requests.get('http://ecp.iedadata.org/soap_search_schema.xsd')
soapXML = soap.content.decode("utf-8")
soapSoup =bs(soapXML, "xml")
enumeration_values = [item['value'] for item in  soapSoup.select("[value]") if item['value']]
print(enumeration_values)

略微更快是使用type selector

import requests 
from bs4 import BeautifulSoup as bs

soap = requests.get('http://ecp.iedadata.org/soap_search_schema.xsd')
soapXML = soap.content.decode("utf-8")
soapSoup =bs(soapXML, "xml")
enumeration_values = [item['value'] for item in  soapSoup.select("enumeration") if item['value']]
print(enumeration_values)