2016-11-06 15 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 

あなたがそうあなたがliststringを連結している、id[0]代わりのidを使用することを希望。公開されたデータ、タイトルとアブストラクトは、あなたが次のコード行を使用してデータを取得することができます得るために

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')]) 

日は少しトリッキーで、全体の引用から抽出する必要がありますが、それ以外のものはすべて直接読み取ることができます。 PubMedの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としてエンコードし、適合しない文字をすべて削除します。 –

関連する問題