想使用python&BeautifulSoup从RCSB页面中提取日志标题吗

2024-05-13 01:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图获得有关蛋白质数据库中的原始引用文件的具体信息,因为只有蛋白质的4个字母的PDBID。你知道吗

为此,我使用python库请求和BeautifulSoup。为了尝试构建代码,我转到了一个特定蛋白质的页面,在本例中是1K48,并且还保存了该页面的HTML(通过点击command+s并将HTML保存到我的桌面上)。你知道吗

首先要注意的是:

1)此页面的url是: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>

更多的是在形式上,但它是不相关的。我只知道我的日记标题生物化学与生物物理,位于类为“se\u 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至少可以验证我得到的是一个空列表。我假设它将返回一个包含两个span标记的列表,类为“seu journal”,但它返回的却是一个空列表。你知道吗

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

有人知道为什么会这样吗?我能做些什么来解决这个问题?你知道吗

谢谢。你知道吗


Tags: 列表doc页面蛋白质classjournalspanse
2条回答

我刚刚发布了一个名为PyPDB的Python包,它可以完成这个任务。可以在here中找到存储库,但它也可以在PyPI上找到

pip install pypdb

对于您的应用程序,我将尝试使用函数descripe\u pdb,它将四个字符的pdb ID作为输入,并返回一个包含与条目相关联的元数据的字典:

my_desc = describe_pdb('4lza')

“我的描述”中有“引文作者”、“结构作者”和“标题”字段,但并非所有条目都与期刊标题相关联。其他选项是使用更广泛的函数get_all_info('4lza'),或者使用get_pdb_file('4lza', filetype='cif', compression=True)获取(并解析)整个raw.pdb文件

您感兴趣的内容是由javascript提供的。这很容易找到,在浏览器上访问相同的网址与javascript禁用,你不会看到具体的信息。它还显示友好消息:

"This browser is either not Javascript enabled or has it turned off. This site will not function correctly without Javascript."

对于javascript驱动的页面,不能使用Python请求。有一些选择,一个是dryscape。你知道吗

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

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

This SO question解释了为什么不推荐这样做。你知道吗

相关问题 更多 >