我已經遇到了三天對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
不知道爲什麼這是硒相關的問題?特別是因爲你沒有提供任何代碼。 – acikojevic
@acikojevic我認爲主要是因爲我使用硒來瀏覽頁面,並讓我混淆了JavaScript,否則BSoup無法看到。 – DMPierre