2016-12-06 5 views
0

私はプログラム的に公共のアーカイブにゲノムアセンブリを説明し、このWebページからテキストを抽出しようとしている:、私は私がダウンして追跡し、研究の受託を抽出したいアセンブリの数千を持っているどのようにPython 2.7を使用してWebページからテキストを抽出するのですか?

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 ******」がここに見られる場所ではないからです。

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 

これは非常によく働いていた:私は以下のコードを使用して、私は同じウェブページから必要に応じて別のコード、常にフォーマットのある走行アク「ERR ******」を抽出するために、これを利用していました研究のアクセス権はXMLにはないので、私はこれをアクセスするために使用することはできません。私は

...

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) 

しかし、再び、私はどちらか、この出力での研究受託を見ることができない。

また、私はこれを行うことによって、HTMLをダウンロードするには、再度BeautifulSoupを使用しようとしました別のpythonモジュール、lxmlを使ってXMLとHTMLを解析しようとしましたが、そこには何の不運もありませんでした。

ページ上の要素を右クリックして検査すると、Ctrl + F - > PRJを実行して研究受託を見つけることができます。

私の質問はこれです:私はinspect要素、XMLまたはHTML(または何か他のもの)で見ているコードは何ですか?なぜ私は、BeautifulSoupを使ってHTMLを解析しようとすると、私のコンソールに表示されるコードと違って見えますか?そして最後に、どのようにこれらのウェブページから研究受託番号(PRJ ******)をスクラップすることができますか?

(私はわずか2ヶ月間コーディングしてきましたが、私は完全に独学していますので、この質問のやや混乱した性質のために謝りますが、私が試していることが分かっていれば幸いですどのような提案や助言をいただければ幸いです。)

+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) 

から...それでsearchに、navigate解析されたツリーへ:

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

スープのオブジェクトは、興味のある文書の一部にアクセスするために、他の可能性を持っていますbs4はxmlファイルを解析できます。ちょうどhtmlのように扱います。それらはすべて同じですので、情報を抽出するためにregexを使う必要はありません。

私は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())とします。

関連する問題