我正在开展一个项目,从大约12,000个PubMed ID的CSV文件中下载标题,摘要,年份和MeSH术语。我写了下面的代码:
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 :(得分:0)
我不知道你的srData.csv文件是怎么样的,但如果它只是一个ID列表,例如
27383269
27281200
您将使用id[0]
代替id
,否则您将联接list
和string
。
为了获取已发布的数据,标题和摘要,您可以使用以下代码行获取数据:
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年7月7日基于分子动力学的改进和验证 sub-5低温电子显微镜图。两个结构确定 方法,基于分子动力学柔性拟合(MDFF) [...]
确保通过encode
删除非ascii字符,否则很多摘要和标题都会给您带来错误。