2016-12-06 3 views
0

Я пытаюсь программно извлечь текст из этой веб-страницы, которая описывает сборку генома в общественном архиве:Как извлечь текст с веб-страницы с помощью python 2.7?

http://www.ebi.ac.uk/ena/data/view/ERS019623

У меня есть тысячи узлов, которые я хочу, чтобы выследить и извлечь исследование о присоединении, который это код в крайнем левом углу таблицы, начинающийся с «PRJ». URL для каждой из этих сборок имеет тот же формат, что и выше, то есть «http://www.ebi.ac.uk/ena/data/view/ERS ******». У меня есть код ERS для каждой из моих сборок, поэтому я могу создать URL-адрес для каждого из них.

Я пробовал несколько разных методов, во-первых, если вы добавили « display = XML» в конец URL-адреса, он печатает XML (или, по крайней мере, я предполагаю, что он печатает XML для всей страницы , потому что проблема в том, что вступление в исследование «PRJ ******» не здесь, где его можно увидеть). Я использовал это, чтобы извлечь другой код, что мне нужно от одной и той же страницы, разбег присоединения, которая всегда в формате «ERR ******», используя код ниже:

import urllib2 
from bs4 import BeautifulSoup 
import re 
import csv 

with open('/Users/bj5/Desktop/web_scrape_test.csv','rb') as f: 
reader = csv.reader(f) #opens csv containig list of ERS numbers 
for row in reader: 
    sample = row[0] #reads index 0 (1st row) 
    ERSpage = "http://www.ebi.ac.uk/ena/data/view/" + sample + "&display=xml" #creates URL using ERS number from 1st row 
    page = urllib2.urlopen(ERSpage) #opens url and assigns it to variable page 
    soup = BeautifulSoup(page, "html.parser") #parses the html/xml from page and assigns it to variable called soup 
    page_text = soup.text #returns text from variable soup, i.e. no tags 
    ERS = re.search('ERS......', page_text, flags=0).group(0) #returns first ERS followed by six wildcards 
    ERR = re.search('ERR......', page_text, flags=0).group(0) #retursn first ERR followed by six wildcards 
    print ERS + ',' + ERR + ',' + "http://www.ebi.ac.uk/ena/data/view/" + sample #prints ERS,ERR,URL 

Это работало очень хорошо , но поскольку присоединение к экзамену отсутствует в XML, я не могу использовать его для доступа к нему.

Я также попытался использовать BeautifulSoup снова, чтобы загрузить HTML, делая это:

from bs4 import BeautifulSoup 
from urllib2 import urlopen 

BASE_URL = "http://www.ebi.ac.uk/ena/data/view/ERS019623" 

def get_category_links(section_url): 
    html = urlopen(section_url).read() 
    soup = BeautifulSoup(html, "lxml") 
    print soup 

get_category_links(BASE_URL) 

Но опять-таки я не могу видеть исследование присоединения на выходе из этого либо ...

I также попытались использовать другой модуль python, lxml, для синтаксического анализа XML и HTML, но им также не повезло.

Когда я нажимаю правой кнопкой мыши и проверяю элемент на странице, я могу найти учебное заведение, выполнив ctrl + F -> PRJ.

Итак, мой вопрос: что такое код, который я просматриваю при проверке элемента, XML или HTML (или что-то еще)? Почему он отличается от кода, который печатает на моей консоли, когда я пытаюсь использовать BeautifulSoup для синтаксического анализа HTML? И, наконец, как я могу очистить вступительные экзамены (PRJ ******) с этих веб-страниц?

(Я только кодировал несколько месяцев, и я полностью самоучкам, поэтому приношу извинения за слегка запутанную природу этого вопроса, но я надеюсь, что у меня получилось, что я пытаюсь Любые предложения или советы были бы высоко оценены.)

+2

Чаще всего, когда вы получаете различный контент в своем браузере, чем то, что вы получаете программным запросом HTTP, это связано с тем, что содержимое, которое вы ищете, генерируется динамически с помощью некоторого кода javascript - который ваш браузер выполняет, но не ваш собственный код. Вы можете попробовать и использовать что-то вроде селена, чтобы получить полный контент. –

ответ

0
from bs4 import BeautifulSoup 
import requests 
import re 

r = requests.get('http://www.ebi.ac.uk/ena/data/view/ERS019623&display=xml') 
soup = BeautifulSoup(r.text, 'lxml') 

ERS = soup.find('primary_id').text 
ERR = soup.find('id', text=re.compile(r'^ERR')).text 
url = 'http://www.ebi.ac.uk/ena/data/view/{}'.format(ERS) 

print(ERS, ERR, url) 

из:

ERS019623 ERR048142 http://www.ebi.ac.uk/ena/data/view/ERS019623 

bs4 может анализировать XML-файл, просто обрабатывать его как html, они все одинаковы, поэтому их нет необходимости использовать регулярное выражение для извлечения информации.

я найти ссылку TEXT скачать:

http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession=ERS019623&result=read_run&fields=study_accession,sample_accession,secondary_sample_accession,experiment_accession,run_accession,tax_id,scientific_name,instrument_model,library_layout,fastq_ftp,fastq_galaxy,submitted_ftp,submitted_galaxy,sra_ftp,sra_galaxy,cram_index_ftp,cram_index_galaxy&download=txt 

fileds эту ссылку, можно изменить, чтобы получить данные, которые вы хотите, как это:

http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession=ERS019623&result=read_run&fields=study_accession&download=txt 

, делая это, вы можете получить все, что вы данные в текстовом файле

+0

Спасибо, что это потрясающе, я полностью пропустил эту ссылку –

0

В вашем образце суп находится объект BeautifulSoup: представление проанализированного документа.

Если вы хотите распечатать весь HTML-документ, вы можете позвонить print(soup.prettify()) или если вы хотите, чтобы текст внутри него print(soup.get_text()).

Объект суп имеет другие возможности для доступа к частям документа вы заинтересованы в: чтобы navigate разобранного дерева, чтобы search в нем ...

Смежные вопросы