2016-12-08 10 views
1

以下のスクリプトは、WebページのURLの一部を構成するコードのリストを含むcsvファイルを作成したものです。次に、各Webページを開き、PUBMED ID(8桁の数字)をスキャンし、見つけた各PUBMED IDをコンマで区切ってCSVファイルに書き込むことができるようにします。Pythonモジュール、BeautifulSoupを使用して関数の出力を解析する

25961941,PRJEB3215 
25909750,PRJEB3215 
26974227,PRJEB3215 
27331909,PRJEB3215 
25038069,PRJEB2705 
25480686,PRJEB2340 

私の問題は、私はちょうどので、私はそれを返すようにしたい機能からoutuputを印刷したくないということです:

import csv 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 
import re 

def get_PMID(y): 
     url = 'http://www.ebi.ac.uk/ena/data/view/' + y + '&display=xml' 
     project_page = urlopen(url) 
     soup = BeautifulSoup(project_page, "html.parser") 
     page_text = soup.text 
     PUBMED_TF = bool(re.findall('PUBMED', page_text)) 
     if PUBMED_TF is True: 
      for x in soup.find_all('db', text='PUBMED'): 
       PUBMED = (x.fetchNextSiblings()[0].text) 
       print PUBMED + ',' + y 
     else: 
      return y 

with open('/Users/bj5/Desktop/web_scrape_test.csv','rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     study_accession = row[0] 
     get_PMID(study_accession) 

は、この形式での出力は、私が欲しいものを正確にしている。このようになります。それを別の関数に解析することができます。しかし、関数からprintコマンドを取り除いてリターンで置き換えようとすると、出力の一部が失われてしまいます。以下を参照してください:

import csv 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 
import re 

def get_PMID(y): 
     url = 'http://www.ebi.ac.uk/ena/data/view/' + y + '&display=xml' 
     project_page = urlopen(url) 
     soup = BeautifulSoup(project_page, "html.parser") 
     page_text = soup.text 
     PUBMED_TF = bool(re.findall('PUBMED', page_text)) 
     if PUBMED_TF is True: 
      for x in soup.find_all('db', text='PUBMED'): 
       PUBMED = (x.fetchNextSiblings()[0].text) 
       return PUBMED + ',' + y 
     else: 
      return y 

with open('/Users/bj5/Desktop/web_scrape_test.csv','rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     study_accession = row[0] 
     print get_PMID(study_accession) 

ができます:

25961941,PRJEB3215 
25038069,PRJEB2705 
25480686,PRJEB2340 

私は、各ページから最初のPUBMED IDが、すべてを失っています。

誰もがこれと私はそれを修正する方法なぜ私に教えてもらえますか?

答えて

0

これは、returnステートメントが関数を中断して値を返すために発生します。したがって、あなたのfor x in soup.find_all('db', text='PUBMED'):ループを中断し、各呼び出しの最初の反復で得られた値のみをget_PMIDに返します。

結果をlistに格納し、最後にリストを返すことを検討してください。

def get_PMID(y): 
    # Initialize list of results 
    result = [] 

    url = 'http://www.ebi.ac.uk/ena/data/view/' + y + '&display=xml' 
    project_page = urlopen(url) 
    soup = BeautifulSoup(project_page, "html.parser") 
    page_text = soup.text 
    PUBMED_TF = bool(re.findall('PUBMED', page_text)) 
    if PUBMED_TF is True: 
     for x in soup.find_all('db', text='PUBMED'): 
      PUBMED = (x.fetchNextSiblings()[0].text) 

      # Store each result found 
      result.append(PUBMED + ',' + y) 

     # Loop finished, now is the time to return the list of results 
     return result 
    else: 
     return y 
+0

答えてくれてありがとうございました。私はreturnステートメントがループ内にまだあるので、リストを使うことは私が必要としていたことではないかと思ったので、ifとelseステートメントの両方の出力をリストに追加してからループの外にリストを返した。 –

関連する問題