【问题标题】:Using Xpath to get an string from a webpage使用 Xpath 从网页中获取字符串
【发布时间】:2016-04-07 16:13:54
【问题描述】:

我正在尝试从此网页获取 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

【问题讨论】:

  • 它返回 None 因为这是你的函数在你没有匹配时返回的内容
  • 但是if语句是怎么得到的呢?我能做些什么来避免它?
  • 你应该检查返回值,只是return tree.xpath(path),忘记if,然后在函数外检查,ret = getUniprot("whatever")然后if ret使用它

标签: python html xpath python-requests


【解决方案1】:

为什么你得到一个空列表是因为看起来你使用了 xpath 当你右键单击并选择 copy xpath 时 chrome 提供,您的 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()'

【讨论】:

  • 感谢您的回答!我有另一个问题。如果我的 ID 指向一个网页,我会遇到一个问题,但是这个没有这个路径,因为没有 UniprotID。如何添加异常以避免不存在的路径?否则它会返回一个空列表。澄清一下:在空列表之后添加异常不允许我摆脱它,无论如何。我试过检查长度和 NoneType。
  • 没有问题,如果没有匹配的元素,只需检查 xpath 返回的内容,if uniprot_id: 只有在找到匹配项时才会为 True。您是在循环执行此操作吗?
  • 只需查找一次uniprot_id = tree.xpath(path) 然后if uniprot_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多