繁体   English   中英

分页/列表的每个第一个元素在AJAX网站上被解析两次 - Selenium 3.0.2,Firefox webdriver,BeautifulSoup 4.5.1

[英]Each first element of a pagination/list gets parsed twice on AJAX website - Selenium 3.0.2, Firefox webdriver, BeautifulSoup 4.5.1

我已经遇到了三天与Selenium和Bs4一起非常恼人的问题 - 虽然我认为Selenium实际上是有罪的(或者更确切地说是我的代码)。

无论如何,作为我之前的一百个人,我正在尝试解析这个网站: http//www.oddsportal.com/soccer/france/ligue-1-2015-2016/results/

我从2015-16赛季开始参加2007-08赛季。 首先我进入季节网页,然后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']

当Selenium进入本赛季的第2,3,4页......时,不会出现这个问题。 另外,正如你可以看到我正在迭代的列表没有任何双重。 最后,所有后续的“子页面”似乎都得到了很好的迭代。

我在这里做错了什么?

我在考虑增加等待,除此之外的任何建议?

值得注意的第一个细节是我使用Firefox Webdriver。 此外,我在Jupyter笔记本电脑上工作(即使我重新启动并运行所有问题仍然在这里)。 那可以解释一下吗?

干杯

编辑

这是用于提取表格数据的代码。 它返回一个数据元素列表列表,然后将其解压缩并附加到特定列表。

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

好的,

对于任何有兴趣和路过的人来说,问题在于我对等待的管理不善。 奇怪的是,最终会让页面被解析两次。 在这里,我看到我甚至没有放任何东西。

最后,当页面动态加载时,我最终添加了以下等待:

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

它现在有效。 而且我修改了一些代码,我在这里描述的主要问题仅仅是因为等待:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM