使用 bs4 抓取 PubMed
Scraping PubMed using bs4
我有一个 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 的错误。我该如何解决这个问题。
CSVfile = open('srData.csv')
fileReader = csv.reader(CSVfile)
Data = list(fileReader)
在这些行之后,Data
是一个列表列表。每个子列表是 CSV 的一个 line/row。这意味着当你遍历它时:
for id in Data:
你每次都会得到一个列表。而是说:
for row in Data:
id = row[0]
还有"http://www.ncbi.nlm.nih.gov/pubmed/" & id
肯定是错的。使用 +
,而不是 &
。
我有一个 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 的错误。我该如何解决这个问题。
CSVfile = open('srData.csv')
fileReader = csv.reader(CSVfile)
Data = list(fileReader)
在这些行之后,Data
是一个列表列表。每个子列表是 CSV 的一个 line/row。这意味着当你遍历它时:
for id in Data:
你每次都会得到一个列表。而是说:
for row in Data:
id = row[0]
还有"http://www.ncbi.nlm.nih.gov/pubmed/" & id
肯定是错的。使用 +
,而不是 &
。