Я пытаюсь найти элементы по простому тексту или innerHTML
тексту:
newresults = driver.find_elements("xpath","//*[@class='card is-category-product']")
for result in newresults:
htmlEl = result.get_attribute('innerHTML')
Итак, по сути, я хочу выполнить поиск в моей переменной htmlElhtmlEl
возвращает каждый блок следующим образом:
<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
.
Вы можете перебирать результаты и выполнять поиск внутри каждого результата.
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)
Это не сработает... смотрите мой ответ.
Вы не хотите искать «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 по многим причинам...
XPaths имеют свое место...
Я просто использую селекторы CSS, когда это возможно... до тех пор, пока мне не придется использовать XPath.
Очень хорошо объяснили, спасибо! Эта точка тоже меня смутила при поиске по предыдущим результатам.
htmlEl
— это обычная текстовая строка. Вы можете использовать.find
и регулярные выражения для поиска или можете уточнить свой xpath, чтобы он возвращал только тот элемент, который вам нужен.