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

Get HTML source of WebElement in Selenium WebDriver using Python

提问人:Chris W. 提问时间:9/1/2011 最后编辑:Peter MortensenChris W. 更新时间:6/28/2023 访问量:701347

问:

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

from selenium import webdriver
wd = webdriver.Firefox()

我知道我可以像这样抓取一个 webelement:

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

我知道我可以通过以下方式获得整页源代码......

wd.page_source

但是有没有办法得到“元素源”呢?

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

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

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

python selenium selenium-webdriver webdriver 自动 测试

评论

12赞 eLRuLL 3/1/2013
你也可以用 beautifulsoup 解析所有的东西wd.page_source
0赞 Hamed Baziyad 5/19/2021
与美丽的汤相比,Selenium拥有更多的设施。

答:

104赞 nilesh 9/3/2011 #1

实际上没有一种直接的方法来获取 .你将不得不使用 JavaScript。我不太确定 python 绑定,但您可以在 Java 中轻松做到这一点。我敢肯定 Python 中一定有类似于类的东西。webelementJavascriptExecutor

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

评论

1赞 Chris W. 9/8/2011
这基本上就是我最终所做的,尽管是 Python 等价物。
8赞 Ryan Shillington 7/10/2012
我认为下面的答案,使用 element.getAttribute(“innerHTML”) 更容易阅读。我不明白为什么人们会投票否决它。
1赞 Anthon 4/30/2014
完全不需要调用 javascript。在 Python 中,只需使用 element.get_attribute('innerHTML')
6赞 nilesh 4/30/2014
@Anthon 不是 DOM 属性。当我在 2011 年回答这个问题时,它对我不起作用,看起来现在一些浏览器正在支持它。如果它适合您,那么使用会更干净。但是,不能保证它适用于所有浏览器。innerHTMLinnerHTML
2赞 Illidan 6/6/2015
显然,这是使用 RemoteWebDriver 时获取 innerHTML 的唯一方法
2赞 oleksii.burdin 9/7/2011 #2

我希望这能有所帮助: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')

评论

7赞 Chris W. 9/8/2011
Python 实际上确实有一个“gettext”等价物(我认为它只是“text”属性?),但实际上只是返回 HTML 标签之间的“明文”,实际上不会返回完整的 HTML 源代码。
2赞 Ryan Shillington 7/10/2012
这也只返回 Java 中的纯文本(而不是 html)。
0赞 HelloW 9/13/2013
你必须像你说的那样引用它elem[0],否则它不起作用
1003赞 Nerijus 12/20/2011 #3

您可以读取该属性以获取元素内容的源或包含当前元素的源。innerHTMLouterHTML

蟒:

element.get_attribute('innerHTML')

爪哇岛:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

红宝石:

element.attribute("innerHTML")

JavaScript的:

element.getAttribute('innerHTML');

PHP的:

$element->getAttribute('innerHTML');

它已经过测试并与 .ChromeDriver

评论

12赞 Bibek Shrestha 3/22/2012
innerHTML 不是 DOM 属性。所以上面的答案是行不通的。innerHTML 是一个 javascript javascript 值。执行上述操作将返回 null。nilesh 的答案是正确的答案。
7赞 Ryan Shillington 7/10/2012
这对我来说效果很好,而且比公认的答案要优雅得多。我正在使用 Selenium 2.24.1。
27赞 CuongHuyTo 7/23/2012
虽然 innerHTML 不是 DOM 属性,但所有主流浏览器都很好地支持它 (quirksmode.org/dom/w3c_html.html)。它对我来说也很有效。
3赞 Kelvin 8/21/2012
+1 这似乎也适用于红宝石。我有一种感觉,该方法(或其他语言中的等效方法)只是调用名称为 arg 的 js 方法。但是,文档没有明确说明这一点,因此 nilesh 的解决方案应该是后备方案。getAttribute
31赞 acdcjunior 5/23/2014
对于 HtmlUnitDriver,此操作失败。适用于 、 、 (IE10) 和 (我没有测试过其他人)。ChromeDriverFirefoxDriverInternetExplorerDriverPhantomJSDriver
-1赞 Ilya 8/31/2012 #4
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 

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

96赞 Mark 3/21/2013 #5

以下是使用 Selenium Python 获取 HTML 源代码的方法:

elem = driver.find_element("xpath", "//*")
source_code = elem.get_attribute("outerHTML")

以下是将该 HTML 保存到文件的方法:

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

评论

2赞 CodeGuru 10/18/2013
我可以设置延迟并获取最新来源吗?有使用 javascript 加载的动态内容。
0赞 TheRookierLearner 10/21/2014
即使页面未完全加载,这是否有效?另外,有没有办法像@FlyingAtom提到的那样设置延迟?
0赞 Parampreet Rai 1/4/2021
如果网页包含动态内容,则取决于该网页的行为,但 90%,您必须在从该页面获取原始 HTML 之前设置延迟。最简单的方法是设置延迟。time.sleep(x) # Where x is seconds
0赞 Victor Stafusa - BozoNaCadeia 9/14/2022
这是一个古老的答案。如今,该方法已不复存在,这给出了.所以,现在,你应该使用 .在这个答案中找到了。find_element_by_xpathAttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'driver.find_element_by_xpath("//*")driver .find_element("xpath", "//*")
6赞 Tiffany G 3/22/2013 #6

事实上,使用属性方法更容易、更直接。

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

如果您想将其他属性绑定到元素,则相同的概念也适用。例如,如果我想要一个元素的字符串,.element.attribute(String)

15赞 John Alberts 4/16/2013 #7

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

0赞 StanleyD 7/9/2013 #8

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

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

评论

0赞 Shane 8/4/2013
感谢您的帮助,我已经使用了这个。我也发现作品是一样的。innerHTML = {solenium selector code}.text
7赞 nefski 3/6/2014 #9

它看起来已经过时了,但无论如何都让它在这里。在您的案例中执行此操作的正确方法:

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)。

-1赞 Zorgijs 5/30/2014 #10

PHPUnit Selenium 测试中,它是这样的:

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

评论

0赞 Laurent 2/4/2023
问题是关于 Python 而不是 PHP
4赞 WltrRpo 3/30/2016 #11

带有 Selenium 2.53.0 的 Java

driver.getPageSource();

评论

0赞 Corey Goldberg 5/31/2017
这不是问题所要求的
0赞 Stephan 7/25/2017
根据 Web 驱动程序,该方法可能不会返回实际的页面源(即可能的 javascript 更改)。返回的源可能是服务器发送的原始源。必须检查 webdriver 文档以确保这一点。getPageSource
0赞 wowandy 12/22/2021
也适用于php -$driver->getPageSource()
4赞 Shubham Jain 9/3/2017 #12

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

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

蟒:

element.get_attribute('innerHTML')

爪哇岛:

elem.getAttribute("innerHTML");

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

driver.getPageSource();
2赞 Rusty 2/5/2018 #13

获取我更喜欢的渲染 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")

评论

1赞 Rusty 2/5/2018
您还可以使用 driver.find_element_by_tag(“body”) 来访问页面的正文内容。
0赞 user10186832 3/8/2023
这适用于带有 Selenium 的 Excel VBA,但需要一些调整。
2赞 Jitendra Pisal 9/22/2019 #14

这对我来说是无缝的。

element.get_attribute('innerHTML')
9赞 undetected Selenium 11/27/2020 #15

其他答案提供了许多有关检索 WebElement 标记的详细信息。然而,一个重要的方面是,现代网站越来越多地实现 JavaScriptReactJSjQueryAjaxVue.js、Ember.jsGWT 等,以呈现 DOM 树中的动态元素。因此,在检索标记之前,有必要等待元素及其子元素完全呈现。


因此,理想情况下,您需要为 Web DriverWait 诱导 并且可以使用以下任一定位器策略visibility_of_element_located()

  • 用: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;", element))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

评论

0赞 David 5/1/2023
一个基本的问题是,我得到什么样的 HTML:1) 只是通过 selenium 隧道的源代码或 b) chrome 之后的源代码(取决于驱动程序也是 Safari 或 Firefox)渲染它?
0赞 user2849367 9/11/2021 #16

使用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")
0赞 christian 10/25/2021 #17

在当前版本的 php-webdriver (1.12.0+) 中,您必须使用

$element->getDomProperty('innerHTML');

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

评论

0赞 Laurent 2/4/2023
当问题专门针对 Python 时,为什么要使用 PHP 来回答?
0赞 wowandy 2/8/2023
@Laurent我在上面回答了你。原因是对于PHP的类似请求,Google会发布此页面
0赞 wowandy 12/22/2021 #18

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

$html = $driver->getPageSource();

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

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

评论

0赞 Laurent 2/4/2023
问题是关于 Python 而不是 PHP
0赞 wowandy 2/5/2023
@Laurent 我知道我可以阅读,但谷歌搜索 php 返回此页面
0赞 wowandy 2/5/2023
@Laurent这个答案有赞成票,这意味着它对某人有帮助
3赞 pr96 12/15/2022 #19

更新了 2022 Selenium 检索 HTML

首先,下载 Selenium WebDriver 的 Python 绑定。

  • 可以从 Selenium 包的 PyPI 页面执行此操作。
  • 或者,可以使用 pip 安装 Selenium 软件包。Python 3.6 在标准库中提供了 pip。

方法 1

读取属性以获取元素内容的来源。 是 DOM 元素的属性,其值是开始标记和结束标记之间的 HTML。innerHTMLinnerHTML

例如,下面代码中的 innerHTML 属性带有值“text”

<p>
a text
</p>
element.get_attribute('innerHTML')

方法 2

读取 以获取当前元素的源。 是一个元素属性,其值是开始和结束标记之间的 HTML 以及所选元素本身的 HTML。outerHTMLouterHTML

例如,代码的属性带有一个值,该值包含 和 。outerHTMLdivspan

<div>
<span>Hello there!</span>
</div>
ele.get_atrribute("outerHTML")