2016-12-06 106 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。

我已经尝试了几种不同的方法,首先如果您在URL的末尾添加“& display = XML”,它会打印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) 

但我又看不到研究加入输出从这个要么...

我也试图使用不同的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 ...