如何使用python 2.7从网页中提取文本?

时间:2016-12-06 10:50:35

标签: python html xml web-scraping beautifulsoup

我尝试以编程方式从此网页中提取文本,该文档描述了公共档案中的基因组程序集:

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 ******)?

(我只编了几个月而且我完全是自学成才,所以对于这个问题略显混乱的性质表示道歉,但我希望我能够理解它是什么我试图这样做。任何建议或建议都会非常感激。)

2 个答案:

答案 0 :(得分:0)

在您的示例中,汤是一个BeautifulSoup对象:已解析文档的表示。

如果您要打印文档的整个HTML,可以致电print(soup.prettify())或者如果您想要其中的文字print(soup.get_text())

汤对象还有其他可能访问您感兴趣的文档的部分内容:navigate已解析的树,其中search ...

答案 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
通过这样做,您可以在文本文件中获取所有数据