我正在尝试使用Selenium从Tableau视图中获取所有可见文本。我将所有可见文本定义为可以使用任何浏览器的搜索功能搜索的任何文本(即 Ctrl + F )。
我已经搜索了许多其他相关问题的答案,但没有一个能适用于我的案例。我尝试了here的最佳答案。它从一开始就不适合我,因为我的browser.page_source
不包含任何可见文本。以下是我的browser.page_source
:
<!DOCTYPE html><html xmlns:ng="" xmlns:tb=""><head><style type="text/css">@charset "UTF-8";[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=1024, maximum-scale=1.3"><meta name="apple-itunes-app" content="app-id=434633927"><meta name="format-detection" content="telephone=no"><script>var BuildId = '9qu3thidy901n388pewixusor';
var StaticAssetsUrlPrefix = '';</script><link rel="stylesheet" type="text/css" href="vizportal.css?9qu3thidy901n388pewixusor"><script src="/javascripts/api/tableau-2.1.0.min.js?9qu3thidy901n388pewixusor"></script><script src="vizportalMinLibs.js?9qu3thidy901n388pewixusor"></script><script src="vizportal.min.js?9qu3thidy901n388pewixusor"></script></head><body class="tb-body"><div ng-app="VizPortalRun" id="ng-app" tb-window-resize="" class="tb-app ng-scope"><!-- uiView: --><div ui-view="" class="tb-app-inner ng-scope"></div><span class="ng-isolate-scope"><div class="tb-toaster tb-enable-selection" data-reactid=".0"></div></span><script type="text/ng-template" id="inline_stackedElement.html"><div tb-window-resize tb-left="left" tb-top="top" tb-right="right" tb-bottom="bottom" tb-visible="visible" class="tb-absolute"></div></script><!-- ngRepeat: stackedElement in stackedElements --><span props="stackedComponentsProps" class="ng-isolate-scope"><div data-reactid=".1"></div></span></div></body></html>
还尝试了最常见的答案here。显然,这不起作用,因为您在上面的页面源中可以看到body
中没有文字。
在这些情况下获取可见文本的正确方法是什么?
答案 0 :(得分:1)
我一直说pages_source
获取来源但不一样,Inspect Element
检查DOM
,源页面虽然实际上是{{3}的原始种子页面} DOM
可以动态更改,通常由JS代码更改,
有时非常戏剧化。您还会注意到Inspect Element
显示了源不显示的阴影元素。
要了解差异的显着程度,请访问chrome://settings/
并点击Inspect element
,然后查看View page source
并进行比较。
因此,您需要从DOM
获取所需内容,以便您可以遍历所有标记并获取textContent
这是JS片段:
page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent;
或在selenium / python中:
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://ranprieur.com")
pagetext = driver.execute_script('page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; return page;')