1

我已經遇到了三天對Selenium和Bs4都非常惱人的問題 - 儘管我認爲硒實際上是有罪的(或者說我的代碼)。分頁/列表的每個第一個元素在AJAX網站上被解析兩次 - Selenium 3.0.2,Firefox webdriver,BeautifulSoup 4.5.1

無論如何,一兩百人在我面前,我試圖分析此網站:http://www.oddsportal.com/soccer/france/ligue-1-2015-2016/results/

我去了2007-08賽季,從2015-16之一。首先我進入賽季網頁,然後Selenium幫助我瀏覽賽季的分頁。完成後,我跳到下一個賽季。

我所做的就是解析每個季節併爲每個季節分頁。所有的鏈接然後被合併到一個列表中。因此,我現在列出了大約72個我正在迭代的鏈接。

樣品清單:

tot_links[0:10] 
['http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/2/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/3/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/4/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/5/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/6/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/7/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2015-2016/results/#/page/8/', 
'http://www.oddsportal.com//soccer/france/ligue-1-2014-2015/results/', 
u'http://www.oddsportal.com//soccer/france/ligue-1-2014-2015/results/#/page/2/'] 

我用Selenium來管理網站的JavaScript,然後BS4收集細胞數據。這裏的一切都很好。

但是,當我運行循環時,我獲得了每個「主要」季節網頁(或分頁的第1頁)數據的兩倍。舉例來說,本賽季的2015 - 2016年,我得到了「團隊」列表中的元素內連續兩次數據[0:2]:

[u'Angers - Toulouse', u'Caen - Bordeaux', ... ,u'Paris SG - Caen', u'Lyon - Nice'] 

[u'Angers - Toulouse', u'Caen - Bordeaux', ... u'Paris SG - Caen', u'Lyon - Nice'] 

再次,對於2014 - 2015年賽季,我將獲得兩倍的數據關於主季的網頁(第一頁):

[u'Bordeaux - Montpellier', u'Caen - Evian TG', ... , u'Toulouse - Nantes', u'Paris SG - Lille'] 

[u'Bordeaux - Montpellier', u'Caen - Evian TG', ... , u'Toulouse - Nantes', u'Paris SG - Lille'] 

當硒經過2日,頁3,4,就不會出現這個問題......本賽季。另外,正如你所看到的,我正在迭代的列表沒有任何雙重性。最後,所有後續的「子頁面」似乎正在迭代。

我在做什麼錯在這裏?

我在想增加等待,除此之外有什麼建議嗎?

值得注意的第一個細節是我使用Firefox Webdriver。另外,我在Jupyter筆記本上做了一些工作(即使我重新啓動並運行所有問題仍然存在)。那些可以解釋什麼?

乾杯

EDIT

這裏是用於提取表的數據的代碼。它返回一個數據元素列表,然後我將它解壓縮並附加到特定列表。

def cells_data(table_soup): 

    match_hour, teams, score, odd_home = [], [], [], [] 
    odd_draw, odd_away, odd_tot = [], [], [] 

    for tr in table_soup.find_all("tr"): 
     for num, td in enumerate(tr.find_all("td")): 
      if num == 0 and td.get_text() != u'': 
       match_hour.append(td.get_text()) 

      elif num == 1 and td.get_text() != u'': 
       teams.append(td.get_text()) 

      elif num == 2 and td.get_text() != u'': 
       score.append(td.get_text()) 

      elif num == 3 and td.get_text() != u'': 
       odd_home.append(td.get_text()) 

      elif num == 4 and td.get_text() != u'': 
       odd_draw.append(td.get_text()) 

      elif num == 5 and td.get_text() != u'': 
       odd_away.append(td.get_text()) 

      elif num == 6 and td.get_text() != u'' : 
       odd_tot.append(td.get_text()) 

    return [match_hour, teams, score, odd_home, odd_draw, odd_away, odd_tot] 

這是任何人都感興趣,路過我使用要經過的環節

_match_hour, _teams, _score, _odd_home = [], [], [], [] 
_odd_draw, _odd_away, _odd_tot = [], [], [] 

for link in tot_links: 

    browser.get(link) 
    soup = BeautifulSoup(browser.page_source) 

    table = soup.find("table", class_ = "table-main") 
    match_hour, teams, score, odd_home, odd_draw, odd_away, odd_tot = cells_data(table) 

    _match_hour.append(match_hour) 
    _teams.append(teams) 
    _score.append(score) 
    _odd_home.append(odd_home) 
    _odd_draw.append(odd_draw) 
    _odd_away.append(odd_away) 
    _odd_tot.append(odd_tot) 

    print link 
+0

不知道爲什麼這是硒相關的問題?特別是因爲你沒有提供任何代碼。 – acikojevic

+0

@acikojevic我認爲主要是因爲我使用硒來瀏覽頁面,並讓我混淆了JavaScript,否則BSoup無法看到。 – DMPierre

回答

0

好了總榜單的代碼,

,這個問題是我的管理不善等待的時間。奇怪的是,它最終會讓頁面被解析兩次。在這裏我看到我甚至沒有放任何東西。

最後,在網頁加載動態,我最終還是增加了以下等待:

wait = WebDriverWait(parser.browser,100).until(EC.visibility_of_element_located 
                 ((By.CLASS_NAME,"table-main"))) 

現在的作品。而且我修改了一些代碼,我在這裏描述的主要問題僅僅是因爲等待:)

相關問題