Соскоб с пандами, Beautifulsoup, urllib: Как получить, возможно, встроенные поля - PullRequest
0 голосов
/ 01 февраля 2019

Я знаю, что есть такие вопросы, я пытался следовать им.Я пытаюсь собрать информацию на этой странице.В идеале я хотел бы, чтобы как можно больше информации было в чистом / легко читаемом видеотрансляторе, но основные части, которые нужно почистить: идентификатор, имя, организм, семейство, классификация, идентификатор UniProt, модификации, идентификаторы последовательности и структуры PDB (например,в этом случае есть список структур PDB, первая - 1BAS, а последняя - 4OEG).

Я написал это в python3:

import urllib.request
import sys
import pandas as pd
import bs4

out = open('pdb.parsed.txt', 'a')
for i in range(1000,1005):
#        try:
            url = 'http://isyslab.info/StraPep/show_detail.php?id=BP' + str(i)
            page = urllib.request.urlopen(url)
            soup = pd.read_html(page)
            print(soup)

Я приложил свой вывод здесь: enter image description here

У меня есть два вопроса:

  1. Вы видите, что некоторая информация, которая мне требуется, отсутствует (например, последовательностьимеет NaN).

  2. Что более важно, я не вижу ни одного поля, которое соответствует списку идентификаторов PDB?

Я надеялся использовать pd.read_html, есливозможно, потому что в прошлом я боролся с urllib / bs4, и я обнаружил, что я был более успешным с pd.read_html в недавних попытках очистки.Может кто-нибудь объяснить, как я мог бы вытащить поля, которые мне нужны?

1 Ответ

0 голосов
/ 02 февраля 2019

Я считаю, что вы не смогли очистить записи из определенных строк, таких как строка «Последовательность», потому что эти строки были заполнены Javascript.Подход, который работал для меня, состоял в том, чтобы использовать комбинацию Selenium с драйвером Firefox для захвата HTML-кода страницы, а затем использовать Beautiful Soup для анализа этого кода.

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

import urllib.request
import sys
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
import csv

pages = []
for page in range(1000,1005):
#        try:
    info_dict = {}
    url = 'http://isyslab.info/StraPep/show_detail.php?id=BP' + str(page)
    driver = webdriver.Firefox()
    driver.get(url)
    html = driver.page_source
    bs = BeautifulSoup(html, 'html.parser')
    main_table = bs.find('table', attrs={'class': 'main_table'})
    rows = main_table.findAll('tr')
    for row in rows:
        try: # We only want rows from a page where both row title and text are not null
            row_header = row.find('th').text
            row_text = row.find('td').text
        except:
            pass
        else:
            if row_header and row_text:
                if row_header in ['ID', 'Name', 'Organism', 'Family', 'Classification', 'UniProt ID']:
                    info_dict[row_header] = row_text
                elif row_header == 'Modification':
                    try: # Some pages have a null table entry for 'Modification'
                        mod_text = row.find('table').find('td').text
                    except:
                        pass
                    else:
                        if mod_text:
                            info_dict[row_header] = mod_text
                        else:
                            info_dict[row_header] = 'NA'
                # Pass 'Sequence' and 'Structure' as space separated strings
                elif row_header == 'Sequence':
                    seqs = ''
                    for i in row_text.split():
                        seqs += ' ' + i
                    info_dict[row_header] = seqs[1:]
                elif row_header == 'Structure':
                    pdb_ids = ''
                    a = row.find('tbody').find_all('a')
                    for i in a:
                        if i.text != '[x]': pdb_ids += ' ' + i.text
                    info_dict[row_header] = pdb_ids[1:]
    pages.append(info_dict)

keys = pages[0].keys()
with open('pdb.parsed.txt', 'a') as output_file:
    writer = csv.DictWriter(output_file, keys, delimiter='\t')
    writer.writeheader()
    writer.writerows(pages) # Add a tab-delimited row for each page we scraped

Затем я могу прочитать в файле .tsv, который я только что создал какфрейм данных, если я хочу:

df = pd.read_csv('pdb.parsed.txt', delimiter='\t')

Это выглядит так: df

Хотя содержимое столбцов, содержащих более длинные строки (например, «Последовательность»),сокращенно, мы можем убедиться, что вся последовательность действительно присутствует:

df.iloc[0]['Sequence']

'PALPEDGGSG AFPPGHFKDP KRLYCKNGGF FLRIHPDGRV DGVREKSDPH IKLQLQAEER GVVSIKGVCA NRYLAMKEDG RLLASKCVTD ECFFFERLES NNYNTYRSRK YTSWYVALKR TGQYKLGSKT GPGQKAILFL PMSAKS'

Содержимое сохраненного файла tsv выглядит следующим образом:

ID  Name    Organism    Family  Classification  UniProt ID  Modification    Sequence    Structure
BP1000  Fibroblast growth factor 2  Homo sapiens    heparin-binding growth factors family   Cytokine/Growth factor  FGF2_HUMAN  Phosphotyrosine; by TEC PALPEDGGSG AFPPGHFKDP KRLYCKNGGF FLRIHPDGRV DGVREKSDPH IKLQLQAEER GVVSIKGVCA NRYLAMKEDG RLLASKCVTD ECFFFERLES NNYNTYRSRK YTSWYVALKR TGQYKLGSKT GPGQKAILFL PMSAKS    1BAS 1BFB 1BFC 1BFF 1BFG 1BLA 1BLD 1CVS 1EV2 1FGA 1FQ9 1II4 1IIL 2BFH 2FGF 2M49 4FGF 4OEE 4OEF 4OEG
BP1001  Interleukin-2   Homo sapiens    IL-2 family Cytokine/Growth factor  IL2_HUMAN       APTSSSTKKT QLQLEHLLLD LQMILNGINN YKNPKLTRML TFKFYMPKKA TELKHLQCLE EELKPLEEVL NLAQSKNFHL RPRDLISNIN VIVLELKGSE TTFMCEYADE TATIVEFLNR WITFCQSIIS TLT  1IRL 1M47 1M48 1M49 1M4A 1M4B 1M4C 1NBP 1PW6 1PY2 1QVN 1Z92 2B5I 2ERJ 3INK 3QAZ 3QB1 4NEJ 4NEM
BP1002  Insulin Bos taurus  insulin family  Hormone INS_BOVIN       GIVEQCCASV CSLYQLENYC N 1APH 1BPH 1CPH 1DPH 1PID 2A3G 2BN1 2BN3 2INS 2ZP6 3W14 4BS3 4E7T 4E7U 4E7V 4I5Y 4I5Z 4IDW 4IHN 4M4F 4M4H 4M4I 4M4J 4M4L 4M4M
BP1003  Interleukin-1 beta  Homo sapiens    IL-1 family Cytokine/Growth factor  IL1B_HUMAN      APVRSLNCTL RDSQQKSLVM SGPYELKALH LQGQDMEQQV VFSMSFVQGE ESNDKIPVAL GLKEKNLYLS CVLKDDKPTL QLESVDPKNY PKKKMEKRFV FNKIEINNKL EFESAQFPNW YISTSQAENM PVFLGGTKGG QDITDFTMQF VSS    1HIB 1I1B 1IOB 1ITB 1L2H 1S0L 1T4Q 1TOO 1TP0 1TWE 1TWM 21BI 2I1B 2KH2 2NVH 31BI 3LTQ 3O4O 3POK 41BI 4DEP 4G6J 4G6M 4GAF 4GAI 4I1B 5BVP 5I1B 6I1B 7I1B 9ILB
BP1004  Lactoferricin-H Homo sapiens    transferrin family  Antimicrobial   TRFL_HUMAN      GRRRSVQWCA VSQPEATKCF QWQRNMRKVR GPPVSCIKRD SPIQCIQA    1Z6V 1XV4 1XV7 1Z6W 2GMC 2GMD

Я использовал следующие команды Anaconda дляустановите Selenium, а затем драйвер Firefox:

conda install -c conda-forge selenium
conda install -c conda-forge geckodriver
...