2012-12-19 13 views
5

Tôi có một danh sách các tên protein ở định dạng "Uniprot" và tôi muốn chuyển đổi tất cả chúng sang định dạng MGI. Nếu bạn truy cập www.uniprot.org và nhập tên protein uniprot vào thanh "Truy vấn", nó sẽ tạo ra một trang chứa một loạt thông tin về protein đó, bao gồm cả tên MGI của nó (mặc dù còn nhiều hơn nữa trên trang).Sử dụng Python để yêu cầu một trang web chạy tìm kiếm

Ví dụ: một tên Uniprot là "Q9D880" và bằng cách cuộn xuống, bạn có thể thấy rằng tên MGI tương ứng của nó là "1913775".

Tôi đã biết cách sử dụng urllib của Python để trích xuất tên MGI từ một trang khi tôi truy cập trang đó. Những gì tôi không biết cách làm là viết mã Python để có được trang chính để chạy truy vấn "Q9D880". Danh sách của tôi chứa 270 tên protein, vì vậy tốt nhất bạn nên tránh sao chép & dán từng tên protein vào thanh Truy vấn.

Tôi thấy bài đăng "Tìm kiếm của Google từ một ứng dụng Python" và tôi hiểu rõ hơn về khái niệm này, nhưng tôi nghi ngờ rằng việc chạy tìm kiếm trên google khác với chức năng tìm kiếm trên một số trang web khác như uniprot. org.

Tôi đang chạy Python 2.7.2, nhưng tôi đang mở để triển khai các giải pháp sử dụng các phiên bản Python khác. Cảm ơn đã giúp đỡ!

+4

Nhìn vào url bạn nhận được khi bạn thực hiện một truy vấn: http://www.uniprot.org/uniprot/Q9D880 Nếu bạn nhìn thực sự khó khăn, bạn có thể tìm ra nơi truy vấn của bạn đã đi ... – l4mpi

+0

Tôi không biết gì về phát triển web, nhưng thậm chí * Tôi * đã có thể thấy điều này! Cảm ơn! –

Trả lời

3

Chạy tìm kiếm xuất hiện để làm một GET trên

http://www.uniprot.org/?dataset=uniprot&query=Q9D880&sort=score&url=&lucky=no&random=no 

Mà cuối cùng chuyển hướng bạn đến

http://www.uniprot.org/uniprot/Q9D880 

Vì vậy, bạn sẽ có thể sử dụng urllib hoặc một thư viện http (tôi sử dụng) để thực hiện GET trên địa chỉ đó, tham số hóa tên protein trong URL để bạn có thể tìm kiếm bất kỳ tên protein nào bạn muốn.

5

Cách dễ dàng hơn để thực hiện việc này là với thư viện requests. Giải pháp của tôi cho bạn cũng lấy thông tin từ trang bằng cách sử dụng BeautifulSoup4.

Tất cả bạn phải do, được đưa ra một cuốn từ điển các tham số truy vấn của bạn, là:

from bs4 import BeautifulSoup as BS 
for protein in my_protein_list: 
    text = requests.get('http://www.uniprot.org/uniprot/' + protein).text 
    soup = BS(text) 
    MGI = soup.find(name='a', onclick="UniProt.analytics('DR-lines', 'click', 'DR-MGI');").text 
    MGI = MGI[4:] 
    print protein +' - ' + MGI 
+0

Tôi gặp phải lỗi tên khi chương trình của tôi đạt đến 'soup = BS (văn bản)' Nó nói tên 'BS' không được xác định. Bất kỳ ý tưởng? –

+0

vâng xin lỗi, quên nói rõ ràng việc nhập, xem ngay – jdotjdot

+0

Cảm ơn, điều đó đã giúp ích. Thật không may, tôi hiện đang gặp sự cố khác. Dòng 'MGI = soup.find (tên ....' đang trả về kiểu "Không có gì". Tôi biết rằng phần tử IS trên trang web, vì vậy tôi đã đi đến phần khắc phục sự cố của tài liệu BS. Nó đề xuất nâng cấp trình phân tích cú pháp của tôi bằng cách tải về 'lxml', có phải bạn có thể giúp tôi tìm ra cách tải xuống hai yêu cầu," libxml2 2.6.21 hoặc mới hơn "và" libxslt 1.1.15 hoặc mới hơn ". Tại url này ftp://xmlsoft.org/libxml2/ Tôi chỉ nhìn thấy một danh sách các tập tin thực sự dài và khó hiểu.Không biết bắt đầu từ đâu. –

1

Các truy vấn được trong URL, bạn có thể gọi:
http://www.uniprot.org/uniprot/?query=1913775&sort=score

tôi didn' t có thời gian để kiểm tra kịch bản này kể từ khi tôi không có 2.x cài đặt nữa nhưng mã trong 2.x nên là một cái gì đó như thế này:

import urllib 
MGIName = "1913775" 
print urllib.urlopen(
    "http://www.uniprot.org/uniprot/?query="+ MGIName +"&sort=score").read() 

Các mã trong 3.2 Tôi chạy là này và nó làm việc tốt:

>>> import urllib.request 
>>> MGIName = "1913775" 
>>> print(urllib.request.urlopen("http://www.uniprot.org/uniprot/?query="+ MGIName +"&sort=score").read()) 

Chỉ cần vòng lặp các MGIname qua danh sách các tên

2

Bạn cũng có thể làm điều này với PyQuery:

>>> from pyquery import PyQuery as pq  
>>> url = "http://www.uniprot.org/uniprot/{name}" 
>>> name = "Q9D880" 
>>> response = pq(url=url.format(name=name)) 
>>> print html("a").filter(lambda e: pq(this).text().startswith("MGI:")).text() 
MGI:1913775