用请求和ElementTree解析XML。

问题描述 投票:0回答:1

我正试图从一个科学数据库中检索数据,我有一个使用urllib和ElementTree的工作脚本,但我想使用更先进的模块,所以我试图用请求重写它。我有一个使用urllib和ElementTree的工作脚本,但我想使用一个更时髦的模块,所以我试图用requests重写它。

不幸的是,ElementTree不想再解析XML了,因为unicode的TypeError。所以我试着用BeautifulSoup来代替,它在一定程度上可以工作,但在访问嵌套标签时有问题。所以回到ElementTree--这也是内置的。

对于下面的代码,我得到 "TypeError: coercing to Unicode: need string or buffer, Response found"。如果我在带有et.parsing的行中添加".text "或".content",错误就不会发生,而是整个网站的内容被打印出来,而不是被解析。

for entry in input_list:
xml = requests.Session().get(url.xml)
if xml.status_code == 200:
    try:
        tree = et.parse(xml)
        root = getroot.tree()

        for record in root.iter(base + 'placeholder').text:
            var1 = record
            break

        print(var1)

    except TypeError:
        print('error on parsing')

else:
    xml.raise_for_status()

编辑。

输出的内容应该是这样的:

accession, name, protein recommendedName, gene name primary, NCBI Taxonomy, organism scientific, sequence, length(长度)

对于这个例子,这将是。

P0AES4, GYRA_ECOLI, DNA基因酶亚单位A, gyrA, 83333, 大肠杆菌(K12菌株), MSDLAREITP..., 875。

xml parsing python-requests elementtree
1个回答
1
投票

你的问题始于 正名:

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'}
© www.soinside.com 2019 - 2024. All rights reserved.