我正在尝试使用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:'值'
答案 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)