2012-12-19 13 views
5

Mam listę nazw białek w formacie "Uniprot" i chciałbym je wszystkie przekonwertować do formatu MGI. Jeśli przejdziesz na stronę www.uniprot.org i wpiszesz nazwę białka uniprot na pasku "Zapytanie", wygeneruje ona stronę zawierającą informacje o tym białku, w tym nazwę MGI (choć znacznie dalej w dalszej części strony).Używanie Pythona do zapytania strony internetowej o uruchomienie wyszukiwania

Na przykład jedną nazwą Uniprot jest "Q9D880", a przewijaniem w dół widać, że odpowiadająca mu nazwa MGI to "1913775".

Już wiem, jak korzystać z urllib Pythona, aby wyodrębnić nazwę MGI ze strony, gdy dojdę do tej strony. To, co mam , nie wiem, jak to zrobić, to napisać kod Pythona, aby uzyskać stronę główną do uruchomienia zapytania "Q9D880". Moja lista zawiera 270 nazw białek, więc dobrze byłoby uniknąć kopiowania nazwy każdego białka do paska Zapytanie.

Widziałem post "Wyszukiwarka Google z aplikacji Pythona" i mam mocniejsze zrozumienie tego pojęcia, ale podejrzewam, że uruchamianie wyszukiwania google różni się od uruchamiania funkcji wyszukiwania w innej witrynie, takiej jak uniprot. org.

Używam wersji Python 2.7.2, ale jestem otwarty na wdrażanie rozwiązań wykorzystujących inne wersje Pythona. Dzięki za pomoc!

+4

Spójrz adres URL otrzymany podczas kwerendy: http://www.uniprot.org/uniprot/Q9D880 Jeśli wyglądasz naprawdę ciężko, możesz dowiedzieć się, gdzie trafiło Twoje zapytanie ... – l4mpi

+0

Nic nie wiem o tworzeniu stron internetowych, ale nawet * Ja * powinienem był to zobaczyć! Dzięki! –

Odpowiedz

3

Prowadzenie poszukiwań wydaje się zrobić GET na

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

który ostatecznie przekierowuje do

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

więc powinieneś być w stanie korzystać urllib lub biblioteki http (używam) do wykonaj GET na tym adresie, sparametryzuj nazwę białka w adresie URL, abyś mógł wyszukać dowolną nazwę białka, którą chcesz.

5

Łatwiejszy sposób to zrobić z biblioteką requests. Moje rozwiązanie dla Ciebie chwyta również samą informację ze strony za pomocą BeautifulSoup4.

All musiałbyś do, zważywszy słownikiem swoimi parametrami zapytania, to:

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

Otrzymuję komunikat o błędzie, gdy mój program osiągnie 'soup = BS (tekst)' Mówi, że nazwa "BS" nie jest zdefiniowana. Jakieś pomysły? –

+0

Tak, przepraszam, zapomniałem jawnie powiedzieć import, spójrz teraz – jdotjdot

+0

Dzięki, pomogło. Niestety, mam teraz inny problem. Wiersz 'MGI = zupa.find (nazwa ....' zwraca typ "Brak" Wiem, że ten element JEST na stronie, więc poszedłem do sekcji rozwiązywania problemów w dokumentacji BS. Sugerował on uaktualnienie mojego parsera pobierając 'lxml' .Czy to coś już zrobiłeś? Jeśli tak, może możesz pomóc mi dowiedzieć się, jak pobrać te dwa wymagania," libxml2 2.6.21 lub nowszy "i" libxslt 1.1.15 lub nowszy ". Pod tym adresem ftp://xmlsoft.org/libxml2/ widzę po prostu długą i mylącą listę plików, nie wiem od czego zacząć –

1

Zapytanie jest w adresie URL, można nazwać:
http://www.uniprot.org/uniprot/?query=1913775&sort=score

Nie miałem” t masz czas na przetestowanie tego skryptu, ponieważ nie mam już zainstalowanego 2.x, ale kod w wersji 2.x powinien wyglądać mniej więcej tak:

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

Kod w 3,2 wpadłem było to i to działało w porządku:

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

Tylko owiń MGIname nad listą nazw

2

Można również zrobić to z 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 
Powiązane problemy