URL 을 이용하여 Pubmed 검색 결과를 얻을 수 있는 방법이 eUtils를 이용하는 것이다. 이것을 이용하면 EndNote 에서 Pubmed 검색 결과를 가져 오는 것을 직접 구현할 수 있다. 자세한 내용은 eUtils 홈페이지에 잘 나와 있다. 여기서는 몇 가지 예를 살펴 보고, 실제로 내가 사용하는 파이썬 스크립트를 올려 놓는다.
다음과 같이 URL 뒤에 적절한 조건을 넣어서 요청을 하면 eUtils 서버에서 결과를 돌려 준다.
search_text = 'TAK1[Text]';
search_address = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1000&term='+search_text.replace(' ','%20');
result = urlretrieve(search_address, 'pub_search_with_term.txt');
search_pmid = get_pmid_list('pub_search_with_term.txt');
search_address = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1000&term='+search_text.replace(' ','%20');
result = urlretrieve(search_address, 'pub_search_with_term.txt');
search_pmid = get_pmid_list('pub_search_with_term.txt');
이 때 눈여겨 보아야 할 것이 [search_address] 변수에 설정하는 URL의 parameter 이다. db로는 pubmed를 사용하고, retmax로 반환되는 결과의 수를 제한하고 있다. term 에 직접 검색에 사용할 검색어를 입력한다. 이 때, URL로 encoding할 때 검색어 중 공백(space)은 '%20'으로 변환해 주어야 결과가 제대로 나온다. 저렇게 하면 title이나 abstract에 TAK1 이 포함된 article의 PMID가 반환된다. 즉, eUtils 는 1. 적절한 조건으로 PMID set을 반환받고, 2. 각각의 PMID에 대한 기록을 다시 요청하여 반환받는 식으로 되어 있다. 위 코드에서는 반환받은 검색결과 파일에서 PMID를 뽑아 가는 함수가 get_pmid_list 로 나와 있다. 그 함수는 다음과 같이 생겼다. 1
def get_pmid_list(pubmed_search_result_file):
if os.path.exists(pubmed_search_result_file) == False: return [];
f = open(pubmed_search_result_file);
pmid_list = [];
for line in f:
m = re.search('<Id>(.*?)</Id>',line);
if m:
pmid = m.group(1);
pmid_list.append(pmid);
continue;
m = re.search('</IdList>', line);
if m:
break;
return pmid_list;
if os.path.exists(pubmed_search_result_file) == False: return [];
f = open(pubmed_search_result_file);
pmid_list = [];
for line in f:
m = re.search('<Id>(.*?)</Id>',line);
if m:
pmid = m.group(1);
pmid_list.append(pmid);
continue;
m = re.search('</IdList>', line);
if m:
break;
return pmid_list;
검색 결과 파일은 xml 형식으로 되어 있는데, 난 작거나 간단한 xml 파일은 DOM이나 SAX를 이용하기 보다는 위처럼 생짜 parsing 을 해서 사용한다. 여하튼 위와 같이 받은 PMID 각각을 이용하여, 각 PMID에 대한 기록, 즉, 저자, 제목, abstract 등의 정보를 얻어 오기 위해서는 다음과 같은 주소 형식을 이용한다.
예를 들면,
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=19895789&retmode=xml
위 주소를 따라 가면 PMID 19895789 에 대한 기록이 xml 파일로 반환된다. (저건 내 석사 논문 ㅋㅋ). 여러 개의 PMID도 한꺼번에 요청하고 결과를 반환받을 수 있으니 여러 개의 결과는 한꺼번에 요청/반환받자. 또한, 기억이 가물가물하기는 한데, 대략 500 개 였나, 여하튼 URL 로 쓸 수 있는 문자열 길이의 제한 때문에 너무 많은 PMID에 대한 결과를 한번에 요청할 수 없었던 것 같다. 그래서 나는 50개의 PMID였나, 하여튼 몇 개씩 잘라서 요청했었던 듯. 2
여러 개의 PMID를 넣어서 xml 형태로 결과를 반환 받고, 그 xml 파일을 parsing 하기 편한 flat file로 변환하는 파이썬 스크립트를 첨부한다.
(음... 윈도우즈에서는 C++로도 사용하는 것이 있는데, 이 부분은 차차 정리하여 나중에 추가한다. 좀 방대한 프로그램의 일부로 들어가 있는 것이라서...)
def fetch_article_information(PMID, dest_file_name):
PMIDLink = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=";
PMIDLink += PMID;
PMIDLink += "&retmode=xml";
urlretrieve(PMIDLink, dest_file_name);
return 1;
PMIDLink = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=";
PMIDLink += PMID;
PMIDLink += "&retmode=xml";
urlretrieve(PMIDLink, dest_file_name);
return 1;
예를 들면,
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=19895789&retmode=xml
위 주소를 따라 가면 PMID 19895789 에 대한 기록이 xml 파일로 반환된다. (저건 내 석사 논문 ㅋㅋ). 여러 개의 PMID도 한꺼번에 요청하고 결과를 반환받을 수 있으니 여러 개의 결과는 한꺼번에 요청/반환받자. 또한, 기억이 가물가물하기는 한데, 대략 500 개 였나, 여하튼 URL 로 쓸 수 있는 문자열 길이의 제한 때문에 너무 많은 PMID에 대한 결과를 한번에 요청할 수 없었던 것 같다. 그래서 나는 50개의 PMID였나, 하여튼 몇 개씩 잘라서 요청했었던 듯. 2
여러 개의 PMID를 넣어서 xml 형태로 결과를 반환 받고, 그 xml 파일을 parsing 하기 편한 flat file로 변환하는 파이썬 스크립트를 첨부한다.
(음... 윈도우즈에서는 C++로도 사용하는 것이 있는데, 이 부분은 차차 정리하여 나중에 추가한다. 좀 방대한 프로그램의 일부로 들어가 있는 것이라서...)
'연구관련 > Bioinfo류' 카테고리의 다른 글
R로 q-value 구하기 (1) | 2010.10.20 |
---|---|
dense subgraph 찾아내기(MCODE) (5) | 2010.07.25 |
정규화(normalization) (18) | 2010.04.19 |
drug 관련 싸이트 (0) | 2010.04.06 |
생물정보학(bioinformatics)에 대하여 (3) | 2010.01.12 |