Найти элемент в тексте HTML — Selenium Python

Я пытаюсь найти элементы по простому тексту или innerHTML тексту:

newresults = driver.find_elements("xpath","//*[@class='card is-category-product']")    
for result in newresults:
    htmlEl = result.get_attribute('innerHTML')

Итак, по сути, я хочу выполнить поиск в моей переменной htmlEl
htmlEl возвращает каждый блок следующим образом:

<figure class = "card-figure card-link">
    <picture class = "card-picture ratio ratio-4x3">
        <source srcset = "url-to-image">
        <source srcset = "url-to-image"> <img src = "url-to-image" class = "card-img object-fit-contain is-contain" loading = "lazy" alt = "image-alt"> </picture>
    <figcaption class = "card-caption">
        <h3 class = "mb-0">TITLE OF CARD</h3>
        <p class = "small">Random text</p>
    </figcaption>
    <a href = "/random-url" class = "card-link-overlay" title = "TITLE" aria-label = "title"></a>
</figure>

Например, я хочу найти элемент H3 с классом «mb-0», который должен вернуть — НАЗВАНИЕ КАРТЫ. я пробовал

foundname = driver.find_element(By.XPATH, "//h3[@class='mb-0']")

но, очевидно, этот поиск выполняется по указанному мной исходному URL-адресу, а не по моей переменной htmlEl.

htmlEl — это обычная текстовая строка. Вы можете использовать .find и регулярные выражения для поиска или можете уточнить свой xpath, чтобы он возвращал только тот элемент, который вам нужен.
Tim Roberts 06.05.2024 00:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете перебирать результаты и выполнять поиск внутри каждого результата.

newresults = driver.find_elements(By.XPATH, "//figure[contains(@class, 'card-figure') and contains(@class, 'card-link')]")

for result in newresults:
    h3_tag = result.find_element(By.XPATH, ".//h3[contains(@class, 'mb-0')]")
    print(h3_tag.text)

Это не сработает... смотрите мой ответ.

JeffC 06.05.2024 01:10
Ответ принят как подходящий

Вы не хотите искать «innerHTML» элемента, потому что он возвращает фактический HTML в виде текста, как он находится в DOM на странице. Это будет означать, что вам нужно будет проанализировать HTML и т. д. Selenium легче справится с этим сценарием.

Что вам нужно, так это объединить вызовы .find_element(), например.

newresults = driver.find_elements(By.XPATH, "//*[@class='card is-category-product']")    
for result in newresults:
    htmlEl = result.find_element(By.XPATH, ".//h3[@class='mb-0']")
             ^^^^^^ we start from result

Поскольку мы объединяем вызовы .find_element() и используем XPath, вам необходимо добавить файл . (точка) в начале внутреннего XPath

.//h3[@class='mb-0']
^ add a dot here

чтобы указать, что вы хотите выполнить поиск по элементу result.

ПРИМЕЧАНИЕ. Если вы используете любой другой тип локатора, например. CSS-селекторы, идентификатор и т. д. вам не нужно добавлять эту точку. Например, тот же код, использующий селекторы CSS, будет выглядеть так:

newresults = driver.find_elements(By.CSS_SELECTOR, ".card.is-category-product")    
for result in newresults:
    htmlEl = result.find_element(By.CSS_SELECTOR, "h3.mb-0")

ПРИМЕЧАНИЕ. Точка в h3.mb-0 указывает на класс «mb-0», не имеет ничего общего с контекстом и т. д.

Я предпочитаю селекторы CSS XPath по многим причинам...

  1. Они быстрее
  2. У них лучшая поддержка браузеров
  3. Синтаксис короче, проще и легче читается.

XPaths имеют свое место...

  1. Это единственный локатор, который может находить элементы по содержащемуся в них тексту.
  2. Это единственный локатор, который может выполнять сложный обход DOM.

Я просто использую селекторы CSS, когда это возможно... до тех пор, пока мне не придется использовать XPath.

Очень хорошо объяснили, спасибо! Эта точка тоже меня смутила при поиске по предыдущим результатам.

buzz 06.05.2024 01:35

Другие вопросы по теме