lxml не учитывает стили CSS при извлечении текста из элементов

1

Я тестирую 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 вести себя так же, как селен + хром?

Теги:
selenium
google-chrome
lxml

1 ответ

1

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

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


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

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


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

  • 1
    О, как плохо :(. О request-html , это просто безголовый хром, обернутый другой библиотекой. Я хочу избежать необходимости использовать весь веб-браузер, так что для моего варианта использования это нет-нет.
  • 0
    Понял; что-то должно анализировать js и css для вас, поэтому оно имеет ту же форму, что и в браузере. Подумайте, что если на странице используется набор фреймов - при разборе только главной страницы вы получите очень ограниченный контент по сравнению с тем, что на самом деле включено (в браузере / парсере). Если хром в этой библиотеке не является вашим предпочтительным ядом, тогда есть фантомы - его разработка остановлена, но все еще полностью пригодна для использования. И да, я понимаю, что подталкиваю вас к решению на основе браузера :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню