Хотите потянуть заголовок журнала с страницы RCSB, используя python & BeautifulSoup

Я пытаюсь получить конкретную информацию об исходном цитирующем документе в Банке данных о белках, который дал только 4-буквенный PDBID белка.

Для этого я использую запросы библиотек python и BeautifulSoup. Чтобы попытаться создать код, я пошел на страницу для конкретного белка, в данном случае 1K48, а также сохранил HTML для страницы (нажав команду + 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('Skjeldal, L.');">Skjeldal, L.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Gran, L.');">Gran, L.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Sletten, K.');">Sletten, K.</a>,&nbsp;&nbsp;<a class="sePrimarycitations se_searchLink" onclick="searchCitationAuthor('Volkman, BF');">Volkman, BF</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» находится в теге span с классом «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, чтобы хотя бы проверить, что я получаю пустой список. Я предположил, что он вернет список, содержащий два тега span с классом «se_journal», но вместо этого возвращает пустой список.

Проведя несколько часов с помощью возможных решений, включая фрагмент кода, который печатал каждый пробел в документе, я пришел к выводу, что запрос doc не содержит строк, которые я хочу вообще.

Кто-нибудь знает, почему это так, и что я могу сделать, чтобы это исправить?

Благодарю.

2 Solutions collect form web for “Хотите потянуть заголовок журнала с страницы RCSB, используя python & BeautifulSoup”

Контент, который вас интересует, предоставляется javascript. Легко узнать, посетите тот же URL-адрес в браузере с отключенным javascript, и вы не увидите эту конкретную информацию. Он также отображает дружеское сообщение:

«Этот браузер либо не включен Javascript, либо отключен. Этот сайт не будет работать корректно без Javascript».

Для управляемых javascript страниц вы не можете использовать запросы Python. Есть несколько альтернатив, один из которых является сухим .

PS: Не импортируйте библиотеки / модули внутри функции. Python не рекомендует его, и PEP08 говорит, что:

Импорт всегда помещается в верхнюю часть файла, сразу после комментариев модуля и доклингов, а также перед глобалами и константами модуля.

Этот вопрос SO объясняет, почему это не рекомендуется для этого.

Я только что опубликовал пакет Python под названием PyPDB, который может выполнить именно эту задачу. Репозиторий можно найти здесь , но он также доступен на PyPI

 pip install pypdb 

Для вашего приложения я бы попробовал функцию describe_pdb, которая принимает четырехзначный идентификатор PDB в качестве ввода и возвращает словарь, содержащий метаданные, связанные с записью:

 my_desc = describe_pdb('4lza') 

В my_desc есть поля для 'citation_authors', 'structure_authors' и 'title', но не все записи имеют связанные с ними заголовки журналов. Другие опции – использовать более широкую функцию get_all_info('4lza') или получить (и разобрать) весь необработанный файл .pdb, используя get_pdb_file('4lza', filetype='cif', compression=True)

  • Почему соединение тупика при использовании с несколькими подпроцессами Popen?
  • Избавление от \ n при использовании .readlines ()
  • Как текстовое найти импортированное имя в модуле
  • Python 2.7 и QGIS 2.6: вычитание двух значений и добавление идентификатора функции в список
  • Как получить одно определенное число раз в массиве python
  • Python 2.7 или 3.3 для изучения Django
  • Использование .iteritems () для итерации по ключу, значение в словаре Python
  • настройка предпочтений Chrome w / Selenium Webdriver в Python
  • Естественно сортировать Pandas DataFrame
  • Python - Чтение символов Unoode из Emoji
  • Вызвать код python3 из кода python2
  • Python - лучший язык программирования в мире.