/usr/share/pybliographer/Pyblio/Query.py is in pybliographer 1.2.14-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | # This file is part of pybliographer
#
# Copyright (C) 1998-2004 Frederic GOBRY
# Email : gobry@pybliographer.org
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
"""
Search a keyword in a medline database
This code has been contributed by: John Vu <jvu001@umaryland.edu>
"""
# The time module is added for querying date ranges of publications
import urllib, urllib2, sys, re, string, time, tempfile, os
query_url = 'http://www.ncbi.nlm.nih.gov/entrez/utils/pmqty.fcgi'
fetch_url = 'http://www.ncbi.nlm.nih.gov/entrez/utils/pmfetch.fcgi'
def query_info (searchterm, field, displaynum, displaystart, edate):
if edate != 'Entrez Date':
params = urllib.urlencode ({
'db': 'pubmed',
'term' : searchterm, # searchterm is user inputted text, modified by limits if applied
'field' : field,
'dopt' : 'd',
'dispmax' : displaynum,
'dispstart' : displaystart - 1, # minus 1 because the count starts at 0 and not at 1
'relentrezdate' : edate # two different search options given, depending on whether the user provides a relative entrez date
})
else:
params = urllib.urlencode ({
'db': 'pubmed',
'term' : searchterm, # searchterm is user inputted text, modified by limits
'field' : field,
'dopt' : 'd',
'dispmax' : displaynum,
'dispstart' : displaystart - 1
})
f = urllib2.urlopen("%s?%s" % (query_url, params))
uids = []
in_body = 0
uid_re = re.compile (r'^([\d]+)<br>')
while 1:
line = f.readline ()
if line == '': break
if in_body:
line = string.strip (string.lower (line))
if line == '</body>': break
ret = uid_re.match (line)
if not ret:
print "unknown line: %s" % line
continue
uids.append (int (ret.group (1)))
else:
line = string.strip (string.lower (line))
if line == '<body>':
in_body = 1
continue
f.close ()
return uids
def medline_query (keyword,maxcount,displaystart,field,abstract,epubahead,pubtype,language,subset,agerange,humananimal,gender,entrezdate,pubdate,fromdate,todate):
# note all the parameters needed to perform the query
# Search with field limits
if field == 'All Fields': field = 'ALL'
elif field == 'Affiliation': field = 'AFFL'
elif field == 'Author Name': field = 'AUTH'
elif field == 'EC/RN Number': field = 'ECNO'
elif field == 'Entrez Date': field = 'EDAT'
elif field == 'Filter': field = 'FLTR'
elif field == 'Issue': field = 'ISS'
elif field == 'Journal Name': field = 'JOUR'
elif field == 'Language': field = 'LANG'
elif field == 'MeSH Date': field = 'MHDA'
elif field == 'MeSH Major Topic': field = 'MAJR'
elif field == 'MeSH Subheading': field = 'SUBH'
elif field == 'MeSH Terms': field = 'MESH'
elif field == 'Pagination': field = 'PAGE'
elif field == 'Publication Date': field = 'PDAT'
elif field == 'Publication Type': field = 'PTYP'
elif field == 'Secondary Source ID': field = 'SI'
elif field == 'Substance Name': field = 'SUBS'
elif field == 'Text Word': field = 'WORD'
elif field == 'Title': field = 'TITL'
elif field == 'Title/Abstract': field = 'TIAB'
elif field == 'UID': field = 'UID'
elif field == 'Volume': field = 'VOL'
# Below is added to keyword if user wants items with abstracts only
if abstract: keyword = keyword + ' AND hasabstract'
# Below is added to keyword if user wants items that are listed on pubmed ahead of print
if epubahead: keyword = keyword + ' AND pubstatusaheadofprint'
# Below are publication type limits to add to keyword
if pubtype == 'Addresses': keyword = keyword + ' AND addresses[pt]'
elif pubtype == 'Bibliography': keyword = keyword + ' AND bibliography[pt]'
elif pubtype == 'Biography': keyword = keyword + ' AND biography[pt]'
elif pubtype == 'Classical Article': keyword = keyword + ' AND classical article[pt]'
elif pubtype == 'Clinical Conference': keyword = keyword + ' AND clinical conference[pt]'
elif pubtype == 'Clinical Trial': keyword = keyword + ' AND clinical trial[pt]'
elif pubtype == 'Clinical Trial, Phase I': keyword = keyword + ' AND clinical trial, phase I[pt]'
elif pubtype == 'Clinical Trial, Phase II': keyword = keyword + ' AND clinical trial, phase II[pt]'
elif pubtype == 'Clinical Trial, Phase III': keyword = keyword + ' AND clinical trial, phase III[pt]'
elif pubtype == 'Clinical Trial, Phase IV': keyword = keyword + ' AND clinical trial, phase IV[pt]'
elif pubtype == 'Comment': keyword = keyword + ' AND comment[pt]'
elif pubtype == 'Congresses': keyword = keyword + ' AND congresses[pt]'
elif pubtype == 'Consensus Development Conference': keyword = keyword + ' AND consensus development conference[pt]'
elif pubtype == 'Consensus Development Conference, NIH': keyword = keyword + ' AND consensus development conference, NIH[pt]'
elif pubtype == 'Controlled Clinical Trial': keyword = keyword + ' AND controlled clinical trial[pt]'
elif pubtype == 'Corrected and Republished Article': keyword = keyword + ' AND corrected and republished article[pt]'
elif pubtype == 'Dictionary': keyword = keyword + ' AND dictionary[pt]'
elif pubtype == 'Directory': keyword = keyword + ' AND directory[pt]'
elif pubtype == 'Duplicate Publication': keyword = keyword + ' AND duplicate publication[pt]'
elif pubtype == 'Editorial': keyword = keyword + ' AND editorial[pt]'
elif pubtype == 'Evaluation Studies': keyword = keyword + ' AND evaluation studies[pt]'
elif pubtype == 'Festschrift': keyword = keyword + ' AND festschrift[pt]'
elif pubtype == 'Government Publications': keyword = keyword + ' AND government publications[pt]'
elif pubtype == 'Guideline': keyword = keyword + ' AND guideline[pt]'
elif pubtype == 'Historical Article': keyword = keyword + ' AND historical article[pt]'
elif pubtype == 'Interview': keyword = keyword + ' AND interview[pt]'
elif pubtype == 'Journal Article': keyword = keyword + ' AND journal article[pt]'
elif pubtype == 'Lectures': keyword = keyword + ' AND lectures[pt]'
elif pubtype == 'Legal Cases': keyword = keyword + ' AND legal cases[pt]'
elif pubtype == 'Legislation': keyword = keyword + ' AND legislation[pt]'
elif pubtype == 'Letter': keyword = keyword + ' AND letter[pt]'
elif pubtype == 'Meta-Analysis': keyword = keyword + ' AND meta-analysis[pt]'
elif pubtype == 'Multicenter Study': keyword = keyword + ' AND multicenter study[pt]'
elif pubtype == 'News': keyword = keyword + ' AND news[pt]'
elif pubtype == 'Newspaper Article': keyword = keyword + ' AND newspaper article[pt]'
elif pubtype == 'Overall': keyword = keyword + ' AND overall[pt]'
elif pubtype == 'Periodical Index': keyword = keyword + ' AND periodical index[pt]'
elif pubtype == 'Practice Guideline': keyword = keyword + ' AND practice guideline[pt'
elif pubtype == 'Published Erratum': keyword = keyword + ' AND published erratum[pt]'
elif pubtype == 'Randomized Controlled Trial': keyword = keyword + ' AND randomized controlled trial[pt]'
elif pubtype == 'Retraction of Publication': keyword = keyword + ' AND retraction of publication[pt]'
elif pubtype == 'Retracted Publication': keyword = keyword + ' AND retracted publication[pt]'
elif pubtype == 'Review': keyword = keyword + ' AND review[pt]'
elif pubtype == 'Review, Academic': keyword = keyword + ' AND review, academic[pt]'
elif pubtype == 'Review Literature': keyword = keyword + ' AND review, literature[pt]'
elif pubtype == 'Review, Multicase': keyword = keyword + ' AND review, multicase[pt]'
elif pubtype == 'Review of Reported Cases': keyword = keyword + ' AND review of reported cases[pt]'
elif pubtype == 'Review, Tutorial': keyword = keyword + ' AND review, tutorial[pt]'
elif pubtype == 'Scientific Integrity Review': keyword = keyword + ' AND scientific integrity review[pt]'
elif pubtype == 'Technical Report': keyword = keyword + ' AND technical report[pt]'
elif pubtype == 'Twin Study': keyword = keyword + ' AND twin study[pt]'
elif pubtype == 'Validation Studies': keyword = keyword + ' AND validation studies[pt]'
# Below are language limits to add to keyword if chosen
if language == 'English': keyword = keyword + ' AND english[la]'
elif language == 'French': keyword = keyword + ' AND french[la]'
elif language == 'German': keyword = keyword + ' AND german[la]'
elif language == 'Italian': keyword = keyword + ' AND italian[la]'
elif language == 'Japanese': keyword = keyword + ' AND japanese[la]'
elif language == 'Russian': keyword = keyword + ' AND russian[la]'
elif language == 'Spanish': keyword = keyword + ' AND spanish[la]'
# Below are subset limits to add to keyword if chosen
if subset == 'AIDS': keyword = keyword + ' AND aids[sb]'
elif subset == 'AIDS/HIV journals': keyword = keyword + ' AND jsubsetx' #X - AIDS/HIV journals, non-Index Medicus
elif subset == 'Bioethics': keyword = keyword + ' AND bioethics[ab]'
elif subset == 'Bioethics journals': keyword = keyword + ' AND jsubsete' #E - bioethics journals, non-Index Medicus
elif subset == 'Biotechnology journals': keyword = keyword + ' AND jsubsetb' #B - biotechnology journals (assigned 1990 - 1998), non-Index Medicus
elif subset == 'Communication disorders journals': keyword = keyword + ' AND jusbsetc' #C - communication disorders journals (assigned 1977 - 1997), non-Index Medicus
elif subset == 'Complementary and Alternative Medicine': keyword = keyword + ' AND cam[sb]'
elif subset == 'Consumer health journals': keyword = keyword + ' AND jsubsetk' #K - consumer health journals, non-Index Medicus
elif subset == 'Core clinical journals': keyword = keyword + ' AND jsubsetaim' #AIM - Abridged Index Medicus A list of core clinical journals created 20 years ago
elif subset == 'Dental journals': keyword = keyword + ' AND jsubsetd' #D - dentistry journals
elif subset == 'Health administration journals': keyword = keyword + ' AND jsubseth' #H - health administration journals, non-Index Medicus
elif subset == 'Health tech assesment journals': keyword = keyword + ' AND jsubsett'#T - health technology assessment journals, non-Index Medicus
elif subset == 'History of Medicine': keyword = keyword + ' AND history[sb]'
elif subset == 'History of Medicine journals': keyword = keyword + ' AND jsubsetq' #Q - history of medicine journals, non-Index Medicus
elif subset == 'In process': keyword = keyword + ' AND in process[sb]'
elif subset == 'Index Medicus journals': keyword = keyword + ' AND jsubsetim' #IM - Index Medicus journals
elif subset == 'MEDLINE': keyword = keyword + ' AND medline[sb]'
elif subset == 'NASA journals': keyword = keyword + ' AND jsubsets' #S - National Aeronautics and Space Administration (NASA) journals, non-Index Medicus
elif subset == 'Nursing journals': keyword = keyword + ' AND jsubsetn' #N - nursing journals
elif subset == 'PubMed Central': keyword = keyword + ' AND medline pmc[sb]'
elif subset == 'Reproduction journals': keyword = keyword + ' AND jsubsetr' #R - reproduction journals (assigned 1972 - 1979), non-Index Medicus
elif subset == 'Space Life Sciences': keyword = keyword + ' AND space[sb]'
elif subset == 'Supplied by Publisher': keyword = keyword + ' AND publisher[sb]'
elif subset == 'Toxicology': keyword = keyword + ' AND tox[sb]'
# Age range will be added to keyword if desired
if agerange == 'All Infant: birth-23 month': keyword = keyword + ' AND infant[mh]'
elif agerange == 'All Child: 0-18 years': keyword = keyword + ' AND child[mh]'
elif agerange == 'All Adult: 19+ years': keyword = keyword + ' AND adult[mh]'
elif agerange == 'Newborn: birth-1 month': keyword = keyword + ' AND infant, newborn[mh]'
elif agerange == 'Infant: 1-23 months': keyword = keyword + ' AND infant[mh]'
elif agerange == 'Preschool Child: 2-5 years': keyword = keyword + ' AND child, preschool[mh]'
elif agerange == 'Child: 6-12 years': keyword = keyword + ' AND child[mh]'
elif agerange == 'Adolescent: 13-18 years': keyword = keyword + ' AND adolescence[mh]'
elif agerange == 'Adult: 19-44 years': keyword = keyword + ' AND adult[mh]'
elif agerange == 'Middle Aged: 45-64 years': keyword = keyword + ' AND middle age[mh]'
elif agerange == 'Aged: 65+ years': keyword = keyword + ' AND aged[mh]'
elif agerange == '80 and over: 80+ years': keyword = keyword + ' AND aged, 80 and over[mh]'
# Human or animal studies limit will be added to keyword if desired
if humananimal == 'Human': keyword = keyword + ' AND human[mh]'
elif humananimal == 'Animal': keyword = keyword + ' AND animal[mh]'
# Studies done on either females or males will be a limit of keyword
if gender == 'Female': keyword = keyword + ' AND female[mh]'
elif gender == 'Male': keyword = keyword + ' AND male[mh]'
# Past Entrez date range will be added to keyword; the number is the relative number of days prior to today
if entrezdate == '30 Days': entrezdate = '30'
elif entrezdate == '60 Days': entrezdate = '60'
elif entrezdate == '90 Days': entrezdate = '90'
elif entrezdate == '180 Days': entrezdate = '180'
elif entrezdate == '1 Year': entrezdate = '365'
elif entrezdate == '2 Years': entrezdate = '730'
elif entrezdate == '5 Years': entrezdate = '1825'
elif entrezdate == '10 Years': entrezdate = '3650'
# if date limits are provided, then the following will be added to keyword
# I will only allow this if the relative entrez date is not specified above, hence the elif command
# This is where I used the time function, gmtime() to get the current global mean time
elif fromdate != '':
if todate == '':
if pubdate == 'Publication Date': keyword = keyword + ' ' + fromdate + ':' + time.strftime('%Y/%m/%d', time.gmtime()) + '[dp]'
elif pubdate == 'Entrez Date': keyword = keyword + ' ' + fromdate +':' + time.strftime('%Y/%m/%d',time.gmtime()) + '[edat]'
else:
if pubdate == 'Publication Date': keyword = keyword + ' ' + fromdate + ':' + todate + '[dp]'
elif pubdate == 'Entrez Date': keyword = keyword + ' ' + fromdate + ':' + todate + '[edat]'
# Below is the actual call to the URL (PubMed's cgi): first to gain the pubmed UIDs
# and then to get the entries that is passed to pyblio to open
uids = query_info (keyword, field, maxcount, displaystart, entrezdate) # get the pubmed UIDs and dump into uids variable
uids = string.replace (str(uids),'[','') # get rid of open bracket in string
uids = string.replace (str(uids),']','') # get rid of close bracket in the string
uids = string.replace (str(uids),' ','') # get rid of all the spaces in the string
if uids.strip () == '': return None
params = urllib.urlencode ({
'db' : 'pubmed',
'report' : 'medline',
'mode' : 'text'
})
url = "%s?%s&id=%s" % (fetch_url, params, str(uids))
content = urllib2.urlopen(url)
fd, fn = tempfile.mkstemp('.medline', 'pyblio-')
while 1:
data = content.read(8192)
if not data:
break
os.write(fd, data)
os.close(fd)
return fn
|