Я тестирую 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 вести себя так же, как селен + хром?
Краткий ответ - это зависит. То, что вы видите в случае селена, - это 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()
request-html
, это просто безголовый хром, обернутый другой библиотекой. Я хочу избежать необходимости использовать весь веб-браузер, так что для моего варианта использования это нет-нет.