ChatGPT解决这个技术问题 Extra ChatGPT

使用 Python 在 Selenium WebDriver 中获取 WebElement 的 HTML 源代码

我正在使用 Python 绑定来运行 Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

我知道我可以像这样抓取一个网络元素:

elem = wd.find_element_by_css_selector('#my-id')

而且我知道我可以通过...获得整页源代码...

wd.page_source

但是有没有办法获得“元素来源”?

elem.source   # <-- returns the HTML as a string

Python 的 Selenium WebDriver 文档基本上不存在,我在代码中看不到任何似乎启用该功能的东西。

访问元素(及其子元素)的 HTML 的最佳方式是什么?

您也可以使用 beautifulsoup 解析所有 wd.page_source
与美丽的汤相比,硒有更多的设施。

P
Peter Mortensen

您可以阅读 innerHTML 属性来获取元素的 content 的来源,或者阅读 outerHTML 来获取当前元素的来源。

Python:

element.get_attribute('innerHTML')

爪哇:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

红宝石:

element.attribute("innerHTML")

JavaScript:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

它已经过测试并与 ChromeDriver 一起使用。


innerHTML 不是 DOM 属性。所以上面的答案是行不通的。 innerHTML 是一个 javascript javascript 值。执行上述操作将返回 null。 nilesh 的答案是正确的答案。
这对我很有用,并且比公认的答案优雅得多。我正在使用 Selenium 2.24.1。
尽管 innerHTML 不是 DOM 属性,但所有主要浏览器 (quirksmode.org/dom/w3c_html.html) 都很好地支持它。它对我也很有效。
+1 这似乎也适用于红宝石。我有一种感觉,getAttribute 方法(或其他语言中的等效方法)只是调用名称为 arg 的 js 方法。但是文档没有明确说明这一点,所以 nilesh 的解决方案应该是一个后备。
这对 HtmlUnitDriver 失败。 适用于 ChromeDriverFirefoxDriverInternetExplorerDriver (IE10) 和 PhantomJSDriver(我没有测试过其他人)。
P
Peter Mortensen

获取 webelement 的 HTML 源代码并没有真正的直接方法。您将不得不使用 JavaScript。我不太确定 python 绑定,但你可以在 Java 中轻松地做到这一点。我确信 Python 中一定有类似于 JavascriptExecutor 类的东西。

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);

这基本上就是我最终要做的事情,尽管使用的是 Python 等价物。
我认为下面的答案,使用 element.getAttribute("innerHTML") 更容易阅读。我不明白为什么人们投票反对。
根本不需要调用javascript。在 Python 中只需使用 element.get_attribute('innerHTML')
@Anthon innerHTML不是 DOM 属性。当我在 2011 年回答这个问题时,它对我不起作用,看起来现在一些浏览器正在支持它。如果它对您有用,那么使用 innerHTML 会更干净。但是,不能保证它适用于所有浏览器。
显然,这是在使用 RemoteWebDriver 时获取 innerHTML 的唯一方法
S
Samuel RIGAUD

当然,我们可以在 Selenium Python 中使用以下脚本获取所有 HTML 源代码:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

如果要将其保存到文件:

with open('c:/html_source_code.html', 'w') as f:
    f.write(source_code.encode('utf-8'))

我建议保存到文件中,因为源代码非常长。


我可以设置延迟并获取最新源吗?有使用 javascript 加载的动态内容。
即使页面没有完全加载,这是否有效?另外,有没有办法像@FlyingAtom 提到的那样设置延迟?
如果网页包含动态内容,那么它取决于该网页的行为,但 90%,您必须在从该页面获取原始 HTML 之前设置延迟。最简单的方法是 time.sleep(x) # Where x is seconds 设置延迟。
A
Ajinkya

在 Ruby 中,使用 selenium-webdriver (2.32.1),有一个包含整个页面源代码的 page_source 方法。


u
undetected Selenium

其他答案提供了许多有关检索 WebElement 标记的详细信息。然而,一个重要的方面是,现代网站越来越多地使用 JavaScriptReactJSjQueryAjaxVue.jsEmber.jsGWT 等来呈现 { 9}。因此,在检索标记之前有必要等待元素及其子元素完全呈现。

Python

因此,理想情况下,您需要为 visibility_of_element_located() 引入 WebDriverWait,并且您可以使用以下任一 Locator Strategies

使用 get_attribute("outerHTML"): element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id"))) print(element.get_attribute("outerHTML"))

使用 execute_script(): element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id"))) print(driver.execute_script("return arguments[0].outerHTML;" , 元素))

注意:您必须添加以下导入: from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC


P
Peter Mortensen

事实上,使用属性方法更简单直接。

将 Ruby 与 Selenium 和 PageObject gem 一起使用,以获取与某个元素关联的类,该行将是 element.attribute(Class)

如果您想获得与元素相关的其他属性,则同样的概念也适用。例如,如果我想要一个元素的 stringelement.attribute(String)


P
Peter Mortensen

它看起来已经过时了,但还是让它在这里吧。在您的情况下正确的方法:

elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)

或者

html = elem.get_attribute('innerHTML')

两者都为我工作(selenium-server-standalone-2.35.0)。


W
WltrRpo

Java 与 Selenium 2.53.0

driver.getPageSource();

这不是问题所要求的
根据网络驱动程序,getPageSource 方法可能不会返回实际的页面源(即,可能会更改 javascript)。返回的源可能是服务器发送的原始源。必须检查 webdriver 文档以确保这一点。
也适用于 php - $driver->getPageSource()
P
Peter Mortensen

InnerHTML 将返回所选元素内的元素,outerHTML 将返回内部 HTML 以及您选择的元素

例子:

现在假设您的元素如下

<tr id="myRow"><td>A</td><td>B</td></tr>

innerHTML 元素输出

<td>A</td><td>B</td>

outerHTML 元素输出

<tr id="myRow"><td>A</td><td>B</td></tr>

现场示例:

http://www.java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtml_and_outerhtml_in_javascript_example.htm

您将在下面找到根据不同绑定所需的语法。根据需要将 innerHTML 更改为 outerHTML

Python:

element.get_attribute('innerHTML')

爪哇:

elem.getAttribute("innerHTML");

如果您想要整个页面的 HTML,请使用以下代码:

driver.getPageSource();

P
Phillip

我希望这会有所帮助:http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

下面介绍Java方法:

java.lang.String    getText() 

但不幸的是,它在 Python 中不可用。因此,您可以将方法名称从 Java 转换为 Python,并使用现有方法尝试另一种逻辑,而无需获取整个页面源...

例如

 my_id = elem[0].get_attribute('my-id')

Python 实际上确实有一个“gettext”等价物(我认为它只是“text”属性?)但它实际上只是返回 HTML 标记之间的“纯文本”,实际上并不会返回完整的 HTML 源代码。
这也只返回 Java 中的纯文本(而不是 html)。
你必须像你说的那样引用它 elem[0] 否则它不起作用
M
MaartenDev

这对我来说无缝。

element.get_attribute('innerHTML')

P
Peter Mortensen

获取我喜欢的渲染 HTML 的方法如下:

driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text

但是,上述方法会删除所有标签(是的,嵌套标签也是如此)并且只返回文本内容。如果您也有兴趣获取 HTML 标记,请使用以下方法。

print body_html.getAttribute("innerHTML")

您还可以使用 driver.find_element_by_tag("body") 到达页面的正文内容。
P
Peter Mortensen

如果您对 Python 中的 Selenium Remote Control 解决方案感兴趣,以下是获取 innerHTML 的方法:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")

感谢您的帮助,我已经使用了这个。我还发现 innerHTML = {solenium selector code}.text 的工作原理相同。
P
Peter Mortensen

PHPUnit Selenium 测试中是这样的:

$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');

u
user2849367

使用 execute_script 获取 html

bs4(BeautifulSoup) 也可以快速访问html标签。

from bs4 import BeautifulSoup
html = adriver.execute_script("return document.documentElement.outerHTML")
bs4_onepage_object=BeautifulSoup(html,"html.parser")
bs4_div_object=bs4_onepage_object.find_all("atag",class_="attribute")

c
christian

在当前版本的 php-webdriver (1.12.0+) 你可以使用

$element->getDomProperty('innerHTML');

正如本期所指出的:https://github.com/php-webdriver/php-webdriver/issues/929


w
wowandy

PHP Selenium WebDriver 中,您可以像这样获取页面源:

$html = $driver->getPageSource();

或者像这样获取元素的 HTML:

// innerHTML if you need HTML of the element content
$html = $element->getDomProperty('outerHTML');

D
Dima Tisnek
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 

这段代码也确实适用于从源代码获取 JavaScript!