【问题标题】:Get PubMed Data from ID using bs4使用 bs4 从 ID 获取 PubMed 数据
【发布时间】:2016-11-06 18:37:50
【问题描述】:

我正在开展一个项目,从大约 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'

我该如何解决这个问题?我也遇到了一个问题,即年份和标题并写在同一个单元格中,但我需要将它们放在不同的列中。我该怎么做才能解决这个问题?

【问题讨论】:

    标签: python csv urllib2 bs4 pubmed


    【解决方案1】:

    我不知道您的 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')])
    

    日期有点棘手,需要从整个引用中提取,但所有其他的都可以直接读取。

    Pubmed ID 27383269 的输出:

    2016 年 7 月 7 日基于分子动力学的改进和验证 sub-5 低温电子显微镜图。二结构测定 方法,基于分子动力学柔性拟合(MDFF) [...]

    一定要通过encode去掉非ascii字符,否则很多摘要和标题会报错。

    【讨论】:

    • @Toby:你可以像上面的例子一样使用它,abstract.encode('ascii', 'ignore'),会尝试将其编码为 ascii 并删除所有不支持的字符不合适。
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多