我正试图从一个科学数据库中检索数据,我有一个使用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 = 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'}