想要使用python& amp;从RCSB页面中提取期刊标题。 BeautifulSoup

时间:2014-10-15 21:55:26

标签: python python-2.7 beautifulsoup python-requests protein-database

我试图获得有关蛋白质数据库中原始引用文章的具体信息,只给出蛋白质的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(&#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”类的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不包括我想要的行。

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

感谢。

2 个答案:

答案 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文件