2016-11-06 106 views
0

我正在从一个约12,000 PubMed ID的CSV文件下载标题,摘要,年份发布和MeSH条款的项目。我已经写了下面的代码:使用bs4从ID获取PubMed数据

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: 
    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([published_date, title, abstract]) 
    i = i+1 
    print i 

当我运行它,我得到以下错误:

TypeError: unsupported operand type(s) for &: 'str' and 'list' 

我怎样才能解决这个问题?我也遇到了一年的问题,题目和写在同一个单元格,但我需要他们在不同的列。我能做些什么来解决这个问题?

回答

0

我不知道你的srData.csv文件是怎么样的,但如果它只是一个ID列表,

27383269 
27281200 

你会使用id[0]代替id,否则你的级连liststring

为了获得公布的数据,标题和摘要,你可以用下面的代码行获得的数据:

published_date = soup.find_all(attrs={"class": "cit"})[0].get_text().split('.')[1].split(';')[0].strip() 
     title = soup.find_all(attrs={"class": "rprt abstract"})[0].h1.string 
     abstract = soup.find_all(attrs={"class": "abstr"})[0].p.string 
     writer.writerow([published_date, title.encode('ascii', 'ignore'), abstract.encode('ascii', 'ignore')]) 

日期是有点棘手,需要从整体引文提取,但所有其他人都可以直接阅读。

输出为考研ID 27383269

2016 Jul 7 Molecular dynamics-based refinement and validation for sub-5 cryo-electron microscopy maps. Two structure determination methods, based on the molecular dynamics flexible fitting (MDFF) [...]

确保通过encode除去非ASCII字符,否则大量的摘要和标题给你的错误。

+0

如何使用编码? – Toby

+0

@Toby:你可以像上面例子那样使用它,abstract.encode('ascii','ignore')会尝试编码以ascii编码,并删除所有不适合的字符。 –