Я встречаюсь в течение трех дней с очень раздражающей проблемой как с 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 гг один. Сначала я попадаю на веб-страницу сезона, затем Селен помогает мне перемещаться по страницам сезона. Когда закончите, я вскакиваю на следующий сезон.
То, что я сделал для этого, анализирует каждый сезон и получает их разбивку на страницы для каждого. Затем все ссылки будут объединены в список. Таким образом, у меня теперь есть большой список из 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