lxml не учитывает стили CSS при извлечении текста из элементов - PullRequest
0 голосов
/ 12 января 2019

Я тестирую selenium + chrome против requests + lxml в целях очистки. Я заинтересован в получении некоторых текстов.

При использовании selenium + chrome я могу сделать:

element = self.driver.find_element_by_xpath(xpath)
return element.text.strip()

, который вернет мне текст элемента, который соответствует селектору xpath. Текст будет отображаться так же, как и на веб-сайте, что означает, что если сам тест выполняется строчными буквами, но содержит text-transform: uppercase, то результатом этого фрагмента кода будет заглавный текст.

Если я сделаю то же самое с lxml, как показано ниже:

elements = self.get_xpath_elements(xpath)
text = ''.join(elements[0].itertext()).strip()

будет возвращать текст в том виде, в каком он представлен в HTML, без учета стиля текста.

Есть ли способ заставить lxml вести себя так же, как селен + хром?

1 Ответ

0 голосов
/ 12 января 2019

Краткий ответ - это зависит. То, что вы видите в случае селена, - это HTML, в его форме после обработки из браузера. И их основная цель (кроме визуализации контента, для нас, простых людей :)), состоит в том, чтобы анализировать html, css и js и применять последние два к первому. Таким образом, получим результат, который с их (JS и CSS) набором правил применяется и эффективен (например, строчными буквами в вашем примере).

lxml или любые другие библиотеки синтаксического анализа XML этого не делают - они анализируют XML / HTML в изоляции , они не знают (или не заботятся) о модификации систем, таких как css (они заботятся о них) XSLT, но это совсем другая тема). Таким образом, результатом, который вы видите, является HTML, как он был написан, в его «ванильной» форме, любые правила CSS, на которые он ссылается, не применяются.


Я говорю «это зависит», потому что вы можете загрузить в lxml (или любой другой парсер) HTML-код, как браузер отображал / манипулировал им. Он доступен вам в атрибуте объекта self.driver.page_source webdriver.

Содержит html в той же форме, которую вы видите в представлении «проверить элемент» браузера - с любыми манипуляциями со структурой (и содержимым) JS и CSS. Тем не менее, я не думаю, что именно этот случай - будет применен нижний регистр текста; Я думаю, что это на этапе рендеринга - например, в источнике значение «как есть», но браузер отображает его по-другому. К сожалению, я не перед компьютером, чтобы попробовать его сам.


Другой подход, который я бы порекомендовал вам, - это попробовать эту библиотеку - reports-html . Это вариант requests, ориентированный на разбор HTML (кхм, просто посмотрите на его название: D). Он поддерживает javascript и, как «побочный эффект» CSS, парсинг необработанного HTML и может помочь вам.
Последнее достигается через response_object.html.render()

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