Похоже, что у вас может быть какое-то искаженное HTML, а Selenium не знает, как его проанализировать. Я заметил эту строку:
<div _ngcontent-rqp-c47="" class="avatar-img-wrap"><img _ngcontent-rqp-c47="" automation-id="watchlist-item-grid-instrument-avatar" class="avatar-img" src="https://etoro-cdn.etorostatic.com/market-avatars/a/150x150.png" alt="Agilent Technologies Inc">
Этот тег <img>
не закрыт. Вы можете видеть, что здесь также запутывается подсветка синтаксиса.
В противном случае искомый XPath выглядит в целом правильно.
Редактировать: посмотрел на это поближе. Ваше имя атрибута должно быть там, где *
. Вот ваш XPath:
"//et-instrument-mobile-row[@class='ng-star-inserted']"
Редактировать 2: У Аскера был дополнительный вопрос о том, как искать в том, что они нашли с XPath выше.
Чтобы найти больше элементов в этих элементах, просматривая документацию , каждый Selenium WebElement
предоставляет свой собственный find_element
метод. Затем вы можете использовать их для дальнейшего поиска в тех элементах, которые мы только что нашли (обязательно используйте .//
здесь, в ваших XPath-файлах, поскольку вам нужно только пройти по этому указанному c содержимому элемента - другие find_elements не имеют этого предупреждения) ,
После того, как вы определили элементы, содержащие символы и цены, вы можете просто ссылаться на атрибут text
этих элементов. Давайте рассмотрим более простой пример:
<div class="a">
<div class="b" id="1">B</div>
<div class="c" id="2">2</div>
<div class="d" id="3">22</div>
</div>
Предположим, мы уже нашли здесь root div
и сохранили его в переменной с именем element
. Тогда:
symbol = element.find_element_by_xpath(".//*[@class='b']").text
integral = element.find_element_by_xpath(".//*[@class='c']").text
fractional = element.find_element_by_xpath(".//*[@class='d']").text
Как правило, если вы можете выполнять поиск с помощью чего-то другого, кроме XPath, это будет проще для всех, кто в нем участвует. Вот более типичный способ сделать это sh с именами классов:
symbol = element.find_element_by_class_name("b").text
integral = element.find_element_by_class_name("c").text
fractional = element.find_element_by_class_name("d").text
Редактировать 3: Примечание автора
После драгоценной помощи @ Сначала я углубился, чтобы получить символ и различные цены для продажи / покупки следующим образом:
for element in results:
symbol = element.find_element_by_xpath(".//*[@class='symbol']").text
print(str(symbol))
sell = element.find_element_by_xpath(".//et-buy-sell-buttons//et-buy-sell-button//div[@automation-id='buy-sell-button-container-sell']")
sell_integral = sell.find_element_by_xpath(".//*[@class='price']").text
sell_fractional = sell.find_element_by_xpath(".//*[@class='after-decimal']").text
print(str(sell_integral)+':'+str(sell_fractional))
buy = element.find_element_by_xpath(".//et-buy-sell-buttons//et-buy-sell-button//div[@automation-id='buy-sell-button-container-buy']")
buy_integral = buy.find_element_by_xpath(".//*[@class='price']").text
buy_fractional = buy.find_element_by_xpath(".//*[@class='after-decimal']").text
print(str(buy_integral)+':'+str(buy_fractional))