【问题标题】:Scraping PubMed using bs4使用 bs4 抓取 PubMed
【发布时间】:2017-03-21 05:09:40
【问题描述】:

我有一个 PubMed id 的数据集(一个 CSV 文件),我需要对其进行迭代,并为每个获取标题、出版年份、摘要和 MeSH 术语,然后我需要将其保存到具有这种格式的 CSV 文件中:

id year_published title abstract mesh_terms     

其中每个项目都位于不同的单独列中。 我尝试使用 bs4 来做到这一点并写了这个:

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:
    try:
        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([id, published_date, title, abstract])
    except:
        writer.writerow([id, "error"])
        print (id)
    i = i+1
    print i

但是,这会引发关于将列表附加到 URL 的错误。我该如何解决这个问题。

【问题讨论】:

    标签: python csv beautifulsoup urllib2 pubmed


    【解决方案1】:
    CSVfile = open('srData.csv')
    fileReader = csv.reader(CSVfile)
    Data = list(fileReader)
    

    在这些行之后,Data 是一个列表列表。每个子列表是 CSV 的一行/行。这意味着当你迭代它时:

    for id in Data:
    

    你每次都会得到一个列表。不如说:

    for row in Data:
        id = row[0]
    

    另外"http://www.ncbi.nlm.nih.gov/pubmed/" & id 肯定是错的。使用+,而不是&

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多