Ваша проблема начинается с правильного именования вещей :
xml = requests.Session().get(url.xml)
requests.get()
не возвращает XML. Он возвращает ответ .
resp = requests.Session().get(url.xml)
И этот ответ может содержать текст (т.е. строку):
print(resp.text)
И эту строку может быть XML, которое ElementTree может преобразовать в дерево:
tree = ET.fromstring(resp.text)
, которое мы затем можем использовать для получения информации:
tree.find('entry')
, которая возвращает None, потому что в этом случае XML находится в пространстве имен (xmlns = "..."), и это пространство имен - http://uniprot.org/uniprot
. Мы должны упомянуть, что когда мы ищем элементы:
tree.find('{http://uniprot.org/uniprot}entry')
, что неудобно писать. Итак, мы делаем аббревиатуру:
xml_ns = {
'up': 'http://uniprot.org/uniprot'
}
и используем вместо этого:
tree.find('up:entry', xml_ns)
, которая теперь печатает
<Element '{http://uniprot.org/uniprot}entry' at 0x03C0AD80>
Используя все это, мы получаем:
import requests
import xml.etree.ElementTree as ET
xml_url = 'https://www.uniprot.org/uniprot/P0AES4.xml'
xml_ns = {
'up': 'http://uniprot.org/uniprot'
}
resp = requests.get(xml_url)
tree = ET.fromstring(resp.text)
def get_text(node):
return node.text if node is not None else None
for entry in tree.findall('./up:entry', xml_ns):
data = {
'accession': get_text( entry.find('./up:accession', xml_ns) )
# find and add more items
}
print(data)
который печатает
{'accession': 'P0AES4'}