0

我正在尝试获取有关蛋白质数据库中原始引用论文的具体信息,仅给出蛋白质的 4 个字母 PDBID。

为此,我使用了 python 库请求和 BeautifulSoup。为了尝试构建代码,我转到了特定蛋白质的页面,在本例中为 1K48,并保存了页面的 HTML(通过按 command+s 并将 HTML 保存到我的桌面)。

首先要注意:

1) 该页面的网址是:http ://www.rcsb.org/pdb/explore.do?structureId=1K48

2) 您可以通过将最后四个字符替换为适当的 PDBID 来访问任何蛋白质的页面。

3) 我打算在许多 PDBID 上执行此过程,以便按它们最初出现的期刊对大列表进行排序。

4) 通过 HTML 搜索,可以在此处的表单中找到期刊标题:

<form action="http://www.rcsb.org/pdb/search/smartSubquery.do" method="post" name="queryForm">  
    <p><span id="se_abstractTitle"><a onclick="c(0);">Refined</a> <a onclick="c(1);">structure</a> <a onclick="c(2);">and</a> <a onclick="c(3);">metal</a> <a onclick="c(4);">binding</a> <a onclick="c(5);">site</a> of the <a onclick="c(8);">kalata</a> <a onclick="c(9);">B1</a> <a onclick="c(10);">peptide.</a></span></p>                                                        
    <p><a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor(&#39;Skjeldal, L.&#39;);">Skjeldal, L.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor(&#39;Gran, L.&#39;);">Gran, L.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor(&#39;Sletten, K.&#39;);">Sletten, K.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor(&#39;Volkman, B.F.&#39;);">Volkman, B.F.</a></p> 
    <p>
        <b>Journal:</b>     
        (2002)
        <span class="se_journal">Arch.Biochem.Biophys.</span>
        <span class="se_journal"><b>399: </b>142-148</span>         
    </p>

表格中有更多内容,但不相关。我所知道的是我的期刊标题“Arch.Biochem.Biophys”位于“se_journal”类的跨度标签内。

所以我写了以下代码:

def JournalLookup():
    PDBID= '1K48'

    import requests
    from bs4 import BeautifulSoup

    session = requests.session()

    req = session.get('http://www.rcsb.org/pdb/explore.do?structureId=%s' %PDBID)

    doc = BeautifulSoup(req.content)
    Journal = doc.findAll('span', class_="se_journal")

理想情况下,我可以使用 find 而不是 findAll,因为这是文档中仅有的两个,但我使用 findAll 至少验证我得到的是一个空列表。我假设它会返回一个包含两个带有“se_journal”类的跨度标签的列表,但它反而返回一个空列表。

在花了几个小时研究可能的解决方案(包括在 doc 中打印每个 span 的一段代码)之后,我得出的结论是 requests doc 根本不包含我想要的行。

有谁知道为什么会这样,我可以做些什么来解决它?

谢谢。

4

2 回答 2

1

您感兴趣的内容由 javascript 提供。很容易找到,在禁用 javascript 的浏览器上访问相同的 URL,您将看不到该特定信息。它还显示一条友好的消息:

“此浏览器要么未启用 Javascript,要么已将其关闭。如果没有 Javascript,此站点将无法正常运行。”

对于 javascript 驱动的页面,您不能使用 Python 请求。有一些替代方案,一个是dryscape

PS:不要在函数中导入库/模块。Python 不推荐它,PEP08说:

导入总是放在文件的顶部,就在任何模块注释和文档字符串之后,模块全局变量和常量之前。

这个 SO question解释了为什么不推荐这样做。

于 2014-10-18T11:44:50.047 回答
1

可以执行此任务的 Python 包 PyPDB。可以在此处找到存储库,但它也可以在 PyPI 上找到

pip install pypdb

对于您的应用程序,该函数describe_pdb将四个字符的 PDB ID 作为输入,并返回包含与条目关联的元数据的字典:

my_desc = describe_pdb('4lza')

'citation_authors'、'structure_authors' 和 'title'中有字段my_desc,但并非所有条目似乎都有与之相关的期刊标题。其他选项是使用更广泛的功能get_all_info('4lza')或使用获取(并解析)整个原始 .pdb 文件 get_pdb_file('4lza', filetype='cif', compression=True)

于 2015-09-07T20:30:43.553 回答