如何使用Selenium和Python从html抓取Alpha Esports文本

时间:2019-02-27 16:19:41

标签: angularjs python-3.x selenium xpath css-selectors

我最近一直在进行一个个人项目来改善我的编程。我是Python的新手。

我想做的是从网站上抓取一些数据(大约100-200个项目)。我已经为某些元素做到了,但没有其他。我要提取的文字是“ Alpha Esports”,但是硒似乎无法识别该类名称。

<span ng-class="$ctrl.className"> Alpha Esports </span>

我相信$ ctrl与angularjs有关。 span标签包含在div标签中,如下所示:

<div class="ui-scoreboard-coupon-template__content--vertical-container"> <!----><div class="ui-scoreboard-coupon-template__content--vertical-aligner" ng-if="!$ctrl.viewModel.isAmericanEvent"> <div> <!----><div class="ui-scoreboard-coupon-template__cell__spacer" ng-if="!$ctrl.viewModel.inPlay"></div><!----> <!----> <div class="ui-scoreboard-coupon-template__cell"> <ui-scoreboard-runner class="ui-scoreboard-runner ui-scoreboard-runner__home" name="$ctrl.viewModel.home">
<span ng-class="$ctrl.className"> Alpha Esports </span> </ui-scoreboard-runner> </div> </div> <div class="ui-scoreboard-coupon-template__row__space"></div> <div> <!----><div class="ui-scoreboard-coupon-template__cell__spacer" ng-if="!$ctrl.viewModel.inPlay"></div><!----> <!----> <div class="ui-scoreboard-coupon-template__cell"> <ui-scoreboard-runner class="ui-scoreboard-runner ui-scoreboard-runner__away" name="$ctrl.viewModel.away">
<span ng-class="$ctrl.className"> G-Rex </span> </ui-scoreboard-runner> </div> </div> </div><!----> <!----> </div>

我已经考虑过使用xpath,但是每个数据块都有所不同,而且我不知道如何制作“动态” xpath。 当我尝试使用父标记的类名称时,它不返回任何元素。我已经尝试了上面代码摘录中提供的所有类名。

teams = []
teams = driver.find_elements_by_class_name("ui-scoreboard-coupon-template__content--vertical-container")

最后,我认为$ ctrl可能已被初始化为代码中较早的内容,但这是它的首次使用:

<div class="collapsed-header collapsed-header--show" ng-show="$ctrl.showCollapsedHeader" ng-class="{'collapsed-header--show': $ctrl.showCollapsedHeader}">
    <div class="frame-layout">
        <div class="left-hand-side">
            <a class="collapsed-header__logo" ng-href="/bet" href="/bet">
              <svg class="collapsed-header__img">
                  <use xlink:href="sprite_9c5b742d050f5c4b58fe55f82f78c576.svg#logos-header_logo-usage"></use>
              </svg>
            </a>
        </div>
        <div class="center"></div>
        <div class="right-hand-side"></div>
    </div>
</div>

由于我对angularjs概念和硒的实现有点不知所措,因此任何有关研究/阅读内容的技巧都将得到广泛赞誉。

2 个答案:

答案 0 :(得分:0)

我尝试使用XPath并成功。请尝试让我知道。

print(driver.find_element_by_xpath("//ui-scoreboard-runner[@class='ui-scoreboard-runner ui-scoreboard-runner__home']/span").text)

答案 1 :(得分:0)

要提取文本 Alpha Esports ,由于该元素是Angular元素,因此必须为所定位元素的可见性诱导 WebDriverWait ,您可以使用以下任一解决方案:

  • CSS_SELECTOR

    myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ui-scoreboard-coupon-template__content--vertical-aligner div:nth-child(2) ui-scoreboard-runner.ui-scoreboard-runner.ui-scoreboard-runner__home>span[ng-class]"))).get_attribute("innerHTML")
    
  • XPATH

    myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='ui-scoreboard-coupon-template__content--vertical-aligner']//following::div[2]//ui-scoreboard-runner[@class='ui-scoreboard-runner ui-scoreboard-runner__home']/span[@ng-class]"))).get_attribute("innerHTML")
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC