2017-04-16 82 views
0

對Python很新穎......我試圖在我的第一個項目上工作。具有多個部分的網頁刮擦頁面

能夠複製一些簡單的演示...但我認爲有幾個額外的複雜性,我想要做什麼。

我想刮gamelogs從NHL網站

這裏是我想出了......類似的代碼工作,爲網站的頂部(例如:得到歲),但它失敗與顯示邏輯的部分(取決於用戶是否對職業,遊戲日誌或拆分點擊)

在此先感謝您的幫助

import urllib2 
from bs4 import BeautifulSoup 

url = 'https://www.nhl.com/player/ryan-getzlaf-8470612?stats=gamelogs-r-nhl&season=20162017' 

page = urllib2.urlopen(url) 
soup = BeautifulSoup(page, 'html.parser') 
Test = soup.find_all('div', attrs={'id': "gamelogsTable"}) 
+0

花費了幾個小時之後,它看起來不顯示在Python請求中......任何想法? – user3339793

回答

0

這種情況與許多網頁。這是因爲一些內容是由最初下載的一部分的Javascript代碼下載的。通過這樣做,這個設計者能夠向訪客顯示頁面的最重要部分,而不用等待整個頁面下載。

當你想刮一個頁面時,你應該做的第一件事是檢查它的源代碼(通常在Windows環境中使用Ctrl-u)來查看你需要的內容是否可用。如果沒有,那麼你需要使用BeautifulSoup以外的東西。

>>> getzlafURL = 'https://www.nhl.com/player/ryan-getzlaf-8470612?stats=gamelogs-r-nhl&season=20162017' 
>>> import requests 
>>> import selenium.webdriver as webdriver 
>>> import lxml.html as html 
>>> import lxml.html.clean as clean 
>>> browser = webdriver.Chrome() 
>>> browser.get(getzlafURL) 
>>> content = browser.page_source 
>>> cleaner = clean.Cleaner() 
>>> content = cleaner.clean_html(content) 
>>> doc = html.fromstring(content) 
>>> type(doc) 
<class 'lxml.html.HtmlElement'> 
>>> open('c:/scratch/temp.htm', 'w').write(content) 
775838 

通過將文件temp.htm中搜索標題「賴恩·蓋茨拉夫遊戲日誌」我能找到的HTML代碼的這一部分。正如你所看到的,這是關於你期望在原始下載的HTML中找到的。然而,這個額外的步驟是必需的。

   </div> 
      </li> 
    </ul> 

    <h5 class="statistics__subheading">Ryan Getzlaf Game Logs</h5> 

    <div id="gamelogsTable"><div class="responsive-datatable"> 

我應該指出,有訪問這樣的代碼,其和爲dryscrape之一的替代方式。我根本無法安裝在Windows機器上。