2016-11-06 70 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編碼,並刪除所有不適合的字符。 –