Извлечь атрибут 'value' из BeautifulSoup xml - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь извлечь ключевые слова поиска из SOAP XML-схемы с BeautifulSoup и не могу понять, как извлечь атрибуты значения.

Я пытался использовать 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 это должно вывести все атрибуты 'value'.

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>

Итак, как вы можете видеть, я пытаюсь получить текст из атрибута value во всех тегах перечисления xs :. Конечным результатом будет список поисковых терминов для level1. i.e.:

(изменение, магматическое, метаморфическое, не найденное, руда, осадочные, жилы, ксенолит)

Я не могу просто вызвать тег перечисления xs: так как существует несколько ключевых слов (т. Е. Level2, level3, SampleType ... и т. Д.), И у каждого из них разные значения перечисления xs :.

Вот ошибка в последней строке (level1 ['value'])


KeyError Traceback (последний вызов был последним) в ----> 1 level1test ['value']

~ / anaconda3 / envs / py37 / lib / python3.7 / site-packages / bs4 / element.py в getitem (self, key) 1069 "" "tag [key] возвращает значение атрибута 'key' для тега, 1070 и выбрасывает исключение, если его там нет. -> 1071 вернуть self.attrs [ключ] 1072 1073 def iter (self):

KeyError: 'value'

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Просто используйте значение селектор атрибута

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)

Предельно быстрее будет использовать селектор типа

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)
0 голосов
/ 30 мая 2019

Просто замените 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...