Как соскрести текст Alpha Esports из HTML, используя Selenium и Python - PullRequest
0 голосов
/ 27 февраля 2019

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

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 голосов
/ 27 февраля 2019

Чтобы извлечь текст 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
    
0 голосов
/ 27 февраля 2019

Я пробовал с XPath, и это работает. Пожалуйста, попробуйте и дайте мне знать.

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