2016-11-07 3 views
0

Ich habe einen Datensatz (eine CSV-Datei) von PubMed-IDs, für die ich durchlaufen muss und für jeden Titel, Jahr veröffentlicht, abstrakte und MeSH Begriffe, die ich dann in eine CSV speichern muss Datei mit folgendem Format:Scarping PubMed mit bs4

wobei sich jedes der Elemente in einer separaten Spalte befindet. ich versuchte BS4 zu verwenden, um dies zu tun, und schrieb dazu:

import urllib2 
from bs4 import BeautifulSoup 
import csv 

CSVfile = open('srData.csv') 
fileReader = csv.reader(CSVfile) 
Data = list(fileReader) 
i = 0 

with open('blank.csv','wb') as f1: 
writer=csv.writer(f1, delimiter='\t',lineterminator='\n',) 
for id in Data: 
    try: 
     soup = BeautifulSoup(urllib2.urlopen("http://www.ncbi.nlm.nih.gov/pubmed/" & id).read()) 
     jouryear = soup.find_all(attrs={"class": "cit"}) 
     year = jouryear[0].get_text() 
     yearlength = len(year) 
     titleend = year.find(".") 
     year1 = titleend+2 
     year2 = year1+1 
     year3 = year2+1 
     year4 = year3+1 
     year5 = year4+1 
     published_date = (year[year1:year5]) 

     title = soup.find_all(attrs={"class": "rprt abstract"}) 
     title = (title[0].h1.string) 

     abstract = (soup.find_all(attrs={"class": "abstr"})) 
     abstract = (abstract[0].p.string) 
     writer.writerow([id, published_date, title, abstract]) 
    except: 
     writer.writerow([id, "error"]) 
     print (id) 
    i = i+1 
    print i 

Dies ist jedoch ein Fehler wirft über eine Liste an eine URL angehängt wird. Wie kann ich das beheben?

Antwort

1
CSVfile = open('srData.csv') 
fileReader = csv.reader(CSVfile) 
Data = list(fileReader) 

Nach diesen Zeilen ist Data eine Liste von Listen. Jede Unterliste ist eine Zeile/Zeile der CSV. Das bedeutet, wenn Sie iterieren:

Sie erhalten jedes Mal eine Liste. Vielmehr sagen:

for row in Data: 
    id = row[0] 

Auch "http://www.ncbi.nlm.nih.gov/pubmed/" & id definitiv falsch ist. Verwenden Sie +, nicht &.