2015-10-15 20 views
2

這是我第一次爬網,我試圖爬網,只有網頁(1 -...),以下網站:無法檢索<a>標記href(以「?」代替http/s開頭)使用beautifulsoup

http://jobs.monster.com/search/?q=data%20science

使用python beautifulsoup,但現在看來似乎是無法識別的廣告代碼的網頁。 標籤看起來是這樣的:

<a href="?q=data-science&amp;page=1" class="page-link">1</a> 

和我的部分代碼如下所示:

import urlparse 
import urllib 
import re 
from bs4 import BeautifulSoup 

# start with this page 
url = "http://jobs.monster.com/search/?q=data%20science" 
     #http://jobs.monster.com/search/?q=data%20science&page=2 

# stack of urls from nytimes 
urls = [url] 
#print urls 

# visited urls 
visited = [url] 

while len(urls) > 0: 
    try: 
     htmltext = urllib.urlopen(urls[0]).read() 
    except: 
     print urls[0] 

    soup = BeautifulSoup(htmltext) 


    urls.pop(0) 

    for tag in soup.find_all('a', {'class':'page-link'}): 
     print tag 

我沒有得到任何錯誤,但沒有什麼是打印出來要麼...我猜那是因爲href不是以http/s開頭的?

任何人都可以幫忙嗎?

感謝

+1

您試圖抓取的頁面可能是由javascript動態生成的。 BeautifulSoup和urllib都不執行javascript,所以它看到的頁面沒有鏈接。將您正在獲取的htmltext轉儲到本地文件中,並查看它實際獲得的內容。 – RobertB

回答

2

的問題是,當它被裝載urllib你的網站不包含與類page-link錨。

但是你在瀏覽器中看到它。這是因爲JavaScript會創建到下一個網站的頁面鏈接。如果您使用具有良好開發人員工具的瀏覽器(我使用Chrome),則可以在網站上禁用JavaScript執行。如果你這樣做,並再次加載網站,你會看到分頁消失。

但是要解決您的問題,您可以提取作業結果計數並根據此值創建URL列表:每個站點顯示20個工作發佈。您可以將結果數除以20,並查看您需要抓取多少頁。當然,這隻適用於結果小於1000的搜索。超過1000個結果只顯示「1000+結果」,因此您無法真正計算頁面數量。

但是,如果仔細查看所加載頁面的源代碼,您可以找到一個創建分頁的JavaScript代碼。這包括您可以用來創建要清除的URL列表的頁面總數。當然,這將包括一些文本解析,但如果你投入一些時間,你可以找到一種方法如何做到這一點。

如果你有,你可以創建一個循環(或發電機),並使用你的註釋行下一個網址的網頁數量:

for p in range(2,page_count+1): 
     url = "http://jobs.monster.com/search/?q=data%20science&page="+str(p) 

urls = ["http://jobs.monster.com/search/?q=data%20science&page="+str(p) for p in range(2, page_count+1)] 

環路從開始2因爲你已經有了第一個站點,所以不需要再次加載它。

0

感謝GHajba的詳細解釋!

這或多或少是我落得這樣做:

try: 
    for i in range(2, 100): 
     page = urlparse.urljoin(mainUrl, "?q=data%20science&page=" + str(i)) 
     readPage = urllib.urlopen(page).read() 
     soup = BeautifulSoup(readPage) 
except: 
    pass 

謝謝大家!

相關問題