【问题标题】:Using Python to ask a web page to run a search使用 Python 请求网页运行搜索
【发布时间】:2025-06-27 13:35:02
【问题描述】:

我有一个“Uniprot”格式的蛋白质名称列表,我想将它们全部转换为 MGI 格式。如果您访问 www.uniprot.org 并在“查询”栏中输入 uniprot 蛋白质名称,它将生成一个页面,其中包含有关该蛋白质的大量信息,包括其 MGI 名称(尽管在页面下方更远)。

比如一个Uniprot名字是“Q9D880”,向下滚动可以看到它对应的MGI名字是“1913775”。

我已经知道如何使用 Python 的 urllib 来从该页面中提取 MGI 名称。我知道该怎么做是编写 Python 代码来让主页运行“Q9D880”的查询。我的列表包含 270 个蛋白质名称,因此最好避免将每个蛋白质名称复制并粘贴到查询栏中。

我看到了“Google Search from a Python App”的帖子,对这个概念有了更深刻的理解,但我怀疑运行谷歌搜索与在其他网站上运行搜索功能不同,比如uniprot.org .

我正在运行 Python 2.7.2,但我愿意实施使用其他 Python 版本的解决方案。感谢您的帮助!

【问题讨论】:

  • 查看执行查询时获得的 url:uniprot.org/uniprot/Q9D880 如果您仔细查看,您可以找出查询的去向...
  • 我对Web开发一无所知,但即使是也应该能够看到这一点!谢谢!

标签: python search web


【解决方案1】:

更简单的方法是使用requests 库。我为您提供的解决方案还使用 BeautifulSoup4 从页面中获取信息本身。

给定查询参数的字典,您只需 do

from bs4 import BeautifulSoup as BS
for protein in my_protein_list:
    text = requests.get('http://www.uniprot.org/uniprot/' + protein).text
    soup = BS(text)
    MGI = soup.find(name='a', onclick="UniProt.analytics('DR-lines', 'click', 'DR-MGI');").text
    MGI = MGI[4:]
    print protein +' - ' + MGI

【讨论】:

  • 当我的程序到达soup = BS(text) 时出现名称错误,它说名称“BS”未定义。有什么想法吗?
  • 是的,抱歉,忘记明确说明导入,现在看
  • 谢谢,有帮助。不幸的是,我现在遇到了另一个问题。 MGI = soup.find(name.... 行返回“无”类型。我知道那个元素在网页上,所以我去了 BS 文档的故障排除部分。它建议通过下载lxml 来升级我的解析器。那是你已经做过的事情了吗?如果是这样,也许您可​​以帮我弄清楚如何下载“libxml2 2.6.21 或更高版本”和“libxslt 1.1.15 或更高版本”这两个要求。在这个 url xmlsoft.org/libxml2 我只看到一个非常长且令人困惑的文件列表。不知道从哪里开始。
  • @Uncle_Dick 不,不需要,这是我的错——我将 URL 设置为 http://www.uniprot.org/' + protein 而不是 http://www.uniprot.org/uniprot/' + protein,应该是这样。再试一次,看看我的更新。
  • @Uncle_Dick 很高兴听到这个消息。如果您的问题已得到解答,社区将有利于您检查问题的最佳答案。
【解决方案2】:

运行搜索似乎是在做一个 GET

http://www.uniprot.org/?dataset=uniprot&query=Q9D880&sort=score&url=&lucky=no&random=no

最终将您重定向到

http://www.uniprot.org/uniprot/Q9D880

所以您应该能够使用urllib 或http 库(我使用httplib2)对该地址执行GET,参数化URL 中的蛋白质名称,以便您可以搜索您想要的任何蛋白质名称。

【讨论】:

  • 我有类似的问题,但它没有重定向到可预测的 URL。这个问题的所有答案都是针对这个特定问题的,但不要解决更普遍的问题。
【解决方案3】:

您也可以使用PyQuery

>>> from pyquery import PyQuery as pq    
>>> url = "http://www.uniprot.org/uniprot/{name}"
>>> name = "Q9D880"
>>> response = pq(url=url.format(name=name))
>>> print html("a").filter(lambda e: pq(this).text().startswith("MGI:")).text()
MGI:1913775

【讨论】:

    【解决方案4】:

    查询在网址中,您可以拨打:
    http://www.uniprot.org/uniprot/?query=1913775&sort=score

    我没有时间测试这个脚本,因为我没有安装 2.x,但是 2.x 中的代码应该是这样的:

    import urllib
    MGIName = "1913775"
    print urllib.urlopen(
        "http://www.uniprot.org/uniprot/?query="+ MGIName +"&sort=score").read()
    

    我运行的 3.2 中的代码是这样的,它运行良好:

    >>> import urllib.request
    >>> MGIName = "1913775"
    >>> print(urllib.request.urlopen("http://www.uniprot.org/uniprot/?query="+ MGIName +"&sort=score").read())
    

    只需在名称列表上循环 MGIname

    【讨论】: