我正在尝试从此网页获取uniprot ID:ENSEMBL。但是我在使用xpath时遇到了麻烦。现在我得到一个空列表,我不明白为什么。
我的想法是编写一个小函数,它接受ENSEMBL ID并返回uniprot ID。
import requests
from lxml import html
ens_code = 'ENST00000378404'
webpage = 'http://www.ensembl.org/id/'+ens_code
response = requests.get(webpage)
tree = html.fromstring(response.content)
path = '//*[@id="ensembl_panel_1"]/div[2]/div[3]/div[3]/div[2]/p/a'
uniprot_id = tree.xpath(path)
print uniprot_id
任何帮助将不胜感激:)
它只打印现有列表,但仍返回Nonetype列表。
def getUniprot(ensembl_code):
ensembl_code = ensembl_code[:-1]
webpage = 'http://www.ensembl.org/id/'+ensembl_code
response = requests.get(webpage)
tree = html.fromstring(response.content)
path = '//div[@class="lhs" and text()="Uniprot"]/following-sibling::div/p/a/text()'
uniprot_id = tree.xpath(path)
if uniprot_id:
print uniprot_id
return uniprot_id
答案 0 :(得分:3)
为什么获取空列表是因为看起来您使用右键单击并提供 copy xpath 时提供的chrome提供的 xpath ,你的xpath什么都不返回的原因是因为标签不在源代码中,它是动态生成的,因此请求返回的内容不包含该元素。
In [6]: response = requests.get(webpage)
In [7]: "ensembl_panel_1" in response.content
Out[7]: False
您应该始终检查页面源以查看您实际获得的内容,您在开发人员控制台中看到的内容不一定是您下载源代码时获得的内容。
如果页面上有其他http://www.uniprot.org/uniprot/
,您还可以使用特定的xpath,在div中搜索"lhs"
的类,然后使用文本Uniprot
获取文本首先关注锚标记:
path = '//div[@class="lhs" and text()="Uniprot"]/following::a[1]/text()'
哪会给你:
['Q8TDY3']
您还可以选择以下兄弟div,其中锚在其子p标签内:
path = '//div[@class="lhs" and text()="Uniprot"]/following-sibling::div/p/a/text()'