我试图获得有关蛋白质数据库中原始引用文章的具体信息,只给出蛋白质的4个字母PDBID。
要做到这一点,我使用的是python库请求和BeautifulSoup。为了尝试构建代码,我转到了特定蛋白质的页面,在本例中为1K48,并且还保存了页面的HTML(通过命令+ 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('Skjeldal, L.');">Skjeldal, L.</a>, <a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Gran, L.');">Gran, L.</a>, <a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Sletten, K.');">Sletten, K.</a>, <a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Volkman, B.F.');">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”类的span标签内。
所以我编写了以下代码:
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”类的两个span标签的列表,但它会返回一个空列表。
在花了几个小时浏览可能的解决方案后,包括在doc中打印每个范围的一段代码,我得出结论,请求doc不包括我想要的行。
有人知道为什么会这样,我可以做些什么来解决它?
感谢。
答案 0 :(得分:1)
您感兴趣的内容由javascript提供。它很容易找到,在禁用javascript的浏览器上访问相同的网址,您将看不到该特定信息。它还会显示一条友好的消息:
&#34;此浏览器未启用Javascript或已关闭。 没有Javascript,此网站将无法正常运行。&#34;
对于javascript驱动的页面,您不能使用Python请求。有一些选择,一个是dryscape。
PS:不要在函数中导入库/模块。 Python不推荐它,PEP08说:
导入总是放在文件的顶部,就在任何模块注释和文档字符串之后,以及模块全局变量和常量之前。
This SO question解释了为什么不建议这样做。
答案 1 :(得分:1)
我刚刚发布了一个名为PyPDB的Python软件包,可以完成这项任务。可以找到存储库here,但它也可以在PyPI上找到
pip install pypdb
对于您的应用程序,我将尝试使用describe_pdb函数,该函数将四个字符的PDB ID作为输入,并返回包含与该条目关联的元数据的字典:
my_desc = describe_pdb('4lza')
my_desc中有'citation_authors','structure_authors'和'title'的字段,但并非所有条目似乎都有与之关联的期刊标题。其他选项是使用更广泛的函数get_all_info('4lza')
或使用get_pdb_file('4lza', filetype='cif', compression=True)
获取(和解析)整个原始.pdb文件