Как получить текст в тегах HTML, не включенных в .content? - PullRequest
0 голосов
/ 14 октября 2019

Я хочу скрести текст со страниц вроде этого: https://www.ncbi.nlm.nih.gov/protein/p22217 в строку. В частности, блок текста в DBSOURCE

Мне кажется, несколько предложений по использованию soup.findall (text = true) и тому подобное, но это ничего не дает. Все, что было до 2018 года или около того, также кажется устаревшим (я использую Python 3.7). Я думаю, что проблема в том, что контент, который я хочу, находится вне диапазона r.text и r.content;когда я ищу ctrl F, искомой части просто нет.

from bs4 import BeautifulSoup

import requests

url = "https://www.ncbi.nlm.nih.gov/protein/P22217"

r = requests.get(url)

data = r.content

soup = BeautifulSoup(data, "html.parser")

PageInfo = soup.find("pre", attrs={"class":"genbank"})

print(PageInfo)

Результатом этой и других попыток является «Нет». Нет сообщения об ошибке, просто ничего не возвращается.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Вы можете использовать это вместо этого, поскольку страница зависит от xmlhttprequests

Код:

from bs4 import BeautifulSoup

import requests,re

url = "https://www.ncbi.nlm.nih.gov/protein/P22217"

r = requests.get(url)
soup = BeautifulSoup(r.content,features='html.parser')
pageId = soup.find('meta', attrs={'name':'ncbi_uidlist'})['content']

api = requests.get('https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?id={}'.format(pageId))

data = re.search(r'DBSOURCE([\w\s\n\t.:,;()-_]*)KEYWORD',api.text)
print(data.group(1).strip())

Демонстрационный код: Здесь

Объяснение:

  • Запрос URL-адреса поможет получить идентификатор запрашиваемого вами продукта, который существует в мета-страницах. .
  • Получив идентификатор, второй запрос будет использовать веб-сайт API, чтобы получить описание, которое вы запрашиваете. Шаблон регулярного выражения будет использоваться для разделения требуемой части и нежелательной части.

Regex:

DBSOURCE([\w\s\n\t.:,;()-_]*)KEYWORD

Демо Regex: Здесь

0 голосов
/ 14 октября 2019

Страница выполняет вызов XHR для получения информации, которую вы ищете. Вызов https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?id=135747&db=protein&report=genpept&conwithfeat=on&show-cdd=on&retmode=html&withmarkup=on&tool=portal&log$=seqview&maxdownloadsize=1000000

и он возвращает

<div class="sequence">
<a name="locus_P22217.3"></a><div class="localnav"><ul class="locals"><li><a href="#comment_P22217.3" title="Jump to the comment section of this record">Comment</a></li><li><a href="#feature_P22217.3" title="Jump to the feature table of this record">Features</a></li><li><a href="#sequence_P22217.3" title="Jump to the sequence of this record">Sequence</a></li></ul></div>
<pre class="genbank">LOCUS       TRX1_YEAST               103 aa            linear   PLN 18-SEP-2019
DEFINITION  RecName: Full=Thioredoxin-1; AltName: Full=Thioredoxin I;
            Short=TR-I; AltName: Full=Thioredoxin-2.
ACCESSION   P22217
VERSION     P22217.3
**DBSOURCE**    UniProtKB: locus TRX1_YEAST, accession <a href="https://www.uniprot.org/uniprot/P22217">P22217</a>;
            class: standard.
            extra accessions:D6VY45
            created: Aug 1, 1991.

...

Так что HTTP-вызов из вашего кода для получения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...