2014-11-05 24 views
1

我是使用BeautifulSoup的全新的,所以如果我的問題是愚蠢的,請原諒我。然而,我一直在谷歌搜索和嘗試建議,在每一個stackoverflow線程我可以從早上6點,但無濟於事。BeautifulSoup返回不同的HTML比查看來源

我的問題是我有一個基因名稱的.csv文件,其中一些是ensEMBL格式,這意味着我必須使用ensembl數據庫來查找我需要的信息。其餘的我可以使用ncbi數據庫。

現在,我的代碼很好。我知道這一點,因爲發送給ncbi的每個查詢都會返回我需要的信息,並且我可以使用BeautifulSoup將其全部提取出來並輸出到csv。但是,無論是urlopen還是BeautifulSoup都沒有按照我所瞭解的方式工作。

當我把下面的URL放到我的地址欄中時,正確的網頁加載:http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404

我可以查看源代碼並查看HTML。然而,當我有:

html = urlopen(http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404, 'lxml') 

它輸出的HTML根本不是我在我的瀏覽器中加載相同的URL並查看源代碼時得到的。我知道對於使用javascript的頁面,inspect元素和視圖源將有所不同,但urlopen應始終返回與視圖源相同的HTML。

我需要在「說明」之後提取字符串。訪問瀏覽器中的鏈接,我可以查看源代碼並查看我需要使用BeautifulSoup查找的代碼;然而,除非urlopen正常工作並返回正確的HTML,否則我無能爲力。我的RA工作取決於今晚完成這項工作。

有什麼建議嗎?

回答

1

頁面的各個部分由腳本標記中引用的Javascript加載,例如「摘要」。但是,您正在查找的文本嵌入在HTML中。定位描述標記後面的文本與此代碼一起工作:

import requests 
from bs4 import BeautifulSoup 

url = "http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404" 
r = requests.get(url, timeout=5) 
html = BeautifulSoup(r.text) 
description = html.find("div", {'class': "rhs"}) 
print description.text 
+0

奇妙地工作。由於我是網絡抓取/抓取的新手,任何信息都可以幫到你。你可以分享爲什麼「requests.get(url)」和html = BeautifulSoup(r.text)返回當我右鍵單擊並查看源代碼時看到的HTML,但html = openurl(ensemblURL)沒有?非常感謝你。 – 2014-11-05 20:26:30

+0

嗯,我不知道,也不打算進行調查,但現在每個人都在使用請求模塊而不是urllib,因爲它使用起來要容易得多。我確信你可以使它與urllib協同工作,但爲什麼要經歷這個麻煩? – ofrommel 2014-11-05 20:33:47

+0

也請這麼友善地標記我的答案是正確的。 – ofrommel 2014-11-05 21:01:02