в Python 3.6 - получение текста с использованием xpath - PullRequest
0 голосов
/ 07 ноября 2018
<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")

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

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

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

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

, чтобы соответствовать u"\xa0" использовать

textInDivTag = texts.get_attribute('innerText')

для соответствия u"\x20" используйте

textInDivTag = texts.text
0 голосов
/ 13 ноября 2018

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

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

  • § 10
  • 10 км / ч
  • 22:00

Другое распространенное использование неразрывного пробела - запрет браузерам урезать пробелы в 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)
0 голосов
/ 07 ноября 2018

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

Согласно комментарию в исходном коде java selenium , .text / .getText() возвращает видимый текст и ссылается на спецификацию w3c webdriver , раздел "11.3.5 Get Элемент Текст "(выделено мной):

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...