【问题标题】:Extract attribute 'value' from BeautifulSoup xml从 BeautifulSoup xml 中提取属性“值”
【发布时间】:2019-10-15 14:17:32
【问题描述】:

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

我尝试过使用soap.find_all,但它不会让我提取值属性。

这是我目前所拥有的:

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 属性中获取文本。最终结果将是 level1 的搜索词列表。即:

(蚀变、火成岩、变质、未发现、矿石、沉积、矿脉、捕虏体)

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

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


KeyError Traceback(最近一次调用最后一次) 在 ----> 1 level1test['value']

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

KeyError: '值'

【问题讨论】:

    标签: xml python-3.x beautifulsoup


    【解决方案1】:

    只需将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
    

    【讨论】:

    • @DeltaV - 刚刚用import bs4soapSoup = bs4.BeautifulSoup(soapXML, "xml") 尝试过,它也可以工作。
    【解决方案2】:

    只需使用 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)
    

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2021-03-27
      • 2013-07-01
      • 2011-02-06
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多