& NBSP; в Python 3.6 - получение текста с использованием xpath

<div class = "card-block cms>
<p>and then have a tea or coffee on the balcony of the cafeteria.</p>
<p>&nbsp;</p>
</div>

Я пытаюсь проверить, содержит ли текст, который я сканирую, веб-сайт

texts = driver.find_element_by_xpath("//div[@class='card-block cms']")
textInDivTag = texts.text
print(textInDivTag)
if u"\xa0" in textInDivTag:
    print("yes")

Мой вывод выглядит следующим образом:

а затем выпить чай или кофе на балконе столовой.

Как видите, он не распознает неразрывный пробел.

4 ответа

Неразрывный пробел (&nbsp;)

Неразрывное пространство то есть &nbsp; это пространство, которое не будет переходить в новую строку. Два слова, разделенные неразрывным пробелом, будут слипаться (не разбиваться на новую строку). Это удобно, когда ломать слова могут быть разрушительными. Примеры:

  • § 10
  • 10 км / ч
  • 10 вечера

Другое распространенное использование неразрывного пробела - это предотвращение усечения браузерами пробелов в HTML-страницах. Если вы напишите в своем тексте 10 пробелов, браузер удалит 9 из них. Чтобы добавить реальные пробелы в ваш текст, вы можете использовать &nbsp; персонаж персонажа.


Element.innerHTML

  • Синтаксис:

    const content = element.innerHTML;
    element.innerHTML = htmlString;
    
  • Значение: Element.innerHTML является DOMString, содержащим сериализацию HTML потомков элемента. Установка значения innerHTML удаляет всех потомков элемента и заменяет их узлами, созданными путем анализа HTML, заданного в строке htmlString.

  • Примечание: если <div>, <span>, или же <noembed> узел имеет дочерний текстовый узел, который включает символы (&), (<), или же (>), innerHTML возвращает эти символы как объекты HTML &amp;, &lt; а также &gt; соответственно. Используйте Node.textContent, чтобы получить необработанную копию содержимого этих текстовых узлов.


Node.innerText

Node.innerText это свойство, которое представляет визуализированное текстовое содержимое узла и его потомков. Как получатель, он аппроксимирует текст, который получит пользователь, если он выделит содержимое элемента курсором и затем скопирует в буфер обмена.


Node.textContent

Node.textContent Свойство представляет текстовое содержимое узла и его потомков.

  • Синтаксис:

    var text = element.textContent;
    element.textContent = "this is some sample text";
    
  • Описание:

  • textContent возвращается null если узел является документом, DOCTYPE или нотацией. Чтобы получить весь текст и данные CDATA для всего документа, можно использовать document.documentElement.textContent,
  • Если узел представляет собой раздел CDATA, комментарий, инструкцию обработки или текстовый узел, textContent возвращает текст внутри этого узла (nodeValue).
  • Для других типов узлов textContent возвращает конкатенацию textContent каждого дочернего узла, за исключением комментариев и инструкций по обработке. Это пустая строка, если у узла нет дочерних элементов.

Этот случай использования

Как ваш случай использования, чтобы проверить, содержит ли веб-сайт &nbsp; Вы должны использовать textContent Свойство следующим образом:

texts = driver.find_element_by_xpath("//div[@class='card-block cms']")
textInDivTag = texts.extContent
print(textInDivTag)

Символ распознан, но он конвертируется в обычный пробел (u"\x20").

Согласно комментарию в исходном коде Java Selen, .text / .getText() возвращает видимый текст и ссылается на спецификацию веб-драйвера w3c, раздел "11.3.5 Получить текст элемента" (выделено мной):

Команда Get Element Text намеревается вернуть текст элемента "как визуализированный". Рендеринг текста элемента также используется для поиска элементов по их тексту ссылки и частичному тексту ссылки.

Одним из основных входов в эту спецификацию был проект Selenium с открытым исходным кодом. Это было широко распространено до написания этой спецификации, и поэтому установило ожидания пользователей относительно того, как должна работать команда Get Element Text. Таким образом, представленный здесь подход, как известно, имеет недостатки, но обеспечивает наилучшую совместимость с существующими пользователями.

Поэтому, вероятно, это поведение соответствует спецификации, но я пока не смог найти исходный код, специально заменяющий неразрывные пробелы обычными пробелами. Я также не смог найти проблему в репозитории Селен, но, возможно, вы можете попробовать, открыв ее.

Соответствовать u"\xa0" использование

textInDivTag = texts.get_attribute('innerText')

соответствовать u"\x20" использование

textInDivTag = texts.text

Попробуйте использовать texts = driver.find_elements_by_xpath("//div[@class='card-block cms']"), это вернет список всех WebElements с этим классом, затем вы можете проверить, есть ли неразрывный пробел в каком-либо из них или в определенном.

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