2016-12-08 2 views
1

Ich habe das folgende Skript geschrieben, die eine CSV-Datei mit einer Liste von Codes alle von denen Teil einer URL für eine Webseite. Es öffnet dann jede Webseite, scannt sie nach einer PUBMED ID (eine 8-stellige Nummer) und gibt jede gefundene PUBMED ID getrennt von dem Code, der die URL vervollständigt hat, durch ein Komma aus, so dass sie in eine CSV-Datei geschrieben werden kann:Parsing Ausgabe von einer Funktion mit dem Python-Modul, BeautifulSoup

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) 

In diesem Format sieht die Ausgabe so was genau das ist, was ich will:

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

Mein Problem ist, dass ich will nicht die outuput von der Funktion zum drucken ich will nur sie zurück, damit ich kann es zu einer anderen Funktion parsen. Wenn ich dies jedoch versuche, indem ich den Druckbefehl von der Funktion entferne und durch Rückkehr ersetze, verliere ich einen Teil der Ausgabe. Siehe unten:

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) 

gibt:

25961941,PRJEB3215 
25038069,PRJEB2705 
25480686,PRJEB2340 

ich alle, aber die erste PUBMED ID von jeder Seite zu verlieren.

Kann mir jemand sagen, warum dies und wie kann ich es korrigieren?

Antwort

0

Dies geschieht, weil die return Anweisung die Funktion unterbricht und den Wert zurückgibt. Daher unterbrechen Sie Ihre for x in soup.find_all('db', text='PUBMED'):-Schleife und geben nur den Wert zurück, der in der ersten Iteration für jeden Aufruf von get_PMID erhalten wurde.

Betrachten Sie stattdessen speichern Ihre Ergebnisse in list und die Liste am Ende zurück.

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

Vielen Dank für Ihre Antwort, die für mich eigentlich nicht ganz funktionierte. Ich nehme an, weil die return-Anweisung immer noch innerhalb der Schleife ist, aber die Verwendung einer Liste war definitiv, was ich tun musste, fügte ich einfach die Ausgabe der if und else-Anweisungen an die Liste und dann die Liste außerhalb der Schleife zurück. –

Verwandte Themen