2016-11-07 46 views
0

我有一个PubMed ID的数据集(一个CSV文件),需要对它进行迭代,并且每个数据集都获得标题,发布年份,抽象和MeSH条款,然后我需要将其保存为CSV具有以下格式的文件:使用bs4的Scarping PubMed

id year_published title abstract mesh_terms  

其中每个项目位于不同的单独列中。 我试图使用BS4做到这一点,写了这个:

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 

然而,这将引发错误关于追加一个列表的URL。我怎样才能解决这个问题。

回答

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

在这些行之后,Data是列表的列表。每个子列表都是一行/每行的CSV。这意味着当您迭代它时:

for id in Data: 

您每次都会得到一个列表。而是说:

for row in Data: 
    id = row[0] 

另外"http://www.ncbi.nlm.nih.gov/pubmed/" & id肯定是错的。使用+,而不是&