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

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

теперь он работает. А также я модифицировал некоторые биты кода, основная проблема, которую я описывала здесь, была просто из-за ожиданий :)