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?
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. –