我尝试以编程方式从此网页中提取文本,该文档描述了公共档案中的基因组程序集:
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)
但我再也看不到输出中的研究加入......
我还尝试使用不同的python模块lxml来解析XML和HTML,但也没有任何运气。
当我右键单击并检查页面上的元素时,我可以通过ctrl + F - >找到学习加入; PRJ。
所以我的问题是:我在inspect元素,XML或HTML(或其他东西)中看到的代码是什么?当我尝试使用BeautifulSoup来解析HTML时,为什么它与我在控制台中打印的代码看起来有所不同?最后,我如何从这些网页中删除学习资料(PRJ ******)?
(我只编了几个月而且我完全是自学成才,所以对于这个问题略显混乱的性质表示道歉,但我希望我能够理解它是什么我试图这样做。任何建议或建议都会非常感激。)
答案 0 :(得分:0)
在您的示例中,汤是一个BeautifulSoup
对象:已解析文档的表示。
如果您要打印文档的整个HTML,可以致电print(soup.prettify())
或者如果您想要其中的文字print(soup.get_text())
。
答案 1 :(得分: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
可以更改此链接的文件以获取所需的数据,如下所示:
http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession=ERS019623&result=read_run&fields=study_accession&download=txt
通过这样做,您可以在文本文件中获取所有数据