Pythonを使用してSelenium WebDriverでWebElementのHTMLソースを取得する


476

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のセレンWebドライバーのドキュメントは基本的に存在せず、その機能を有効にしているように見えるコードには何もありません。

要素(およびその子)のHTMLにアクセスする最良の方法について何か考えはありますか?


8
またwd.page_source、beautifulsoupですべてを解析することもできます
eLRuLL

回答:


748

innerHTML属性を読み取って、要素のコンテンツのソースを取得するかouterHTML、現在の要素のソースを取得できます。

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

ルビー:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

テストされ、で動作しますChromeDriver


9
innerHTMLはDOM属性ではありません。したがって、上記の答えは機能しません。innerHTMLは、javascript javascript値です。上記を実行するとnullが返されます。nileshの答えは正しい答えです。
bibstha 2012年

6
これは私にとってはうまくいき、受け入れられた答えよりもはるかにエレガントです。私はSelenium 2.24.1を使用しています。
Ryan Shillington

22
innerHTMLはDOM属性ではありませんが、すべての主要なブラウザー(quirksmode.org/dom/w3c_html.html)で十分にサポートされています。それは私にとってもうまくいきます。
CuongHuyTo

3
+1これはルビでも動作するようです。私は、getAttributeメソッド(または他の言語では同等のもの)が、名前がargであるjsメソッドを呼び出すだけだと感じています。しかし、ドキュメントはこれを明示的に述べていないので、nileshの解決策はフォールバックであるべきです。
ケルビン

23
これは失敗しHtmlUnitDriverます。以下のための作品ChromeDriverFirefoxDriverInternetExplorerDriver(IE10)とPhantomJSDriver(私は他の人をテストしていません)。
acdcjunior 2014年

91

のHTMLソースコードを取得する簡単な方法は実際にはありませんwebelement。JSを使用する必要があります。私はpythonバインディングについてあまり確信がありませんが、Javaでこれを簡単に行うことができます。JavascriptExecutorPythonのクラスに似たものがあるに違いない。

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

1
これは、Pythonの同等機能ではありますが、基本的に私がやったことです。
クリスW.

8
element.getAttribute( "innerHTML")を使用すると、以下の答えがはるかに読みやすくなります。なぜ人々が反対票を投じているのか理解できません。
Ryan Shillington、2012

1
JavaScriptを呼び出す必要はまったくありません。Pythonでは、element.get_attribute( 'innerHTML')を使用するだけ
Anthon

6
@Anthon innerHTMLはDOM属性ではありません。2011年にこの質問に回答したところ、うまくいきませんでした。現在、一部のブラウザでサポートされているようです。それがあなたのために働くなら、それから使うことinnerHTMLはよりきれいです。ただし、すべてのブラウザで動作する保証はありません。
nilesh 14

2
どうやら、これはRemoteWebDriverの使用中にinnerHTMLを取得する唯一の方法です
Illidan

73

もちろん、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'))

ソースコードが非常に長いため、ファイルに保存することをお勧めします。


2
遅延を設定して最新のソースを取得できますか?JavaScriptを使用して読み込まれた動的コンテンツがあります。
CodeGuru 2013年

ページが完全に読み込まれていなくても機能しますか?また、@ FlyingAtomのような遅延を設定する方法はありますか?
TheRookierLearner 2014年


5

実際には、属性メソッドを使用する方が簡単で簡単です。

RubyをSeleniumおよびPageObject gemと一緒に使用して、特定の要素に関連付けられたクラスを取得する場合、行はになりますelement.attribute(Class)

要素に関連付けられた他の属性を取得する場合も、同じ概念が適用されます。例えば、私は要素の文字列を望んでいた場合は、element.attribute(String)


4

古く見えますが、とにかくここにしましょう。あなたの場合にそれを行う正しい方法:

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)


3

Java with Selenium 2.53.0

driver.getPageSource();

それは質問が求めたものではありません
コリー・ゴールドバーグ2017年

Webドライバーによっては、getPageSourceメソッドが実際のページソースを返さない場合があります(つまり、JavaScriptが変更されている可能性があります)。返されるソースは、サーバーから送信された生のソースである場合があります。この点を確認するには、webdriverドキュメントを確認する必要があります。
ステファン

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

6
Pythonには実際には「gettext」に相当するものがありますが(「text」属性だと思いますか?)、実際にはHTMLタグ間の「プレーンテキスト」を返すだけで、実際には完全なHTMLソースを返しません。
クリスW.

2
これはJavaでもプレーンテキスト(htmlではなく)のみを返します。
Ryan Shillington、2012

elem [0]と同じように参照する必要があります。そうしないと機能しません
HelloW


1

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

Java:

elem.getAttribute("innerHTML");

ページ全体のHTMLが必要な場合は、以下のコードを使用してください。

driver.getPageSource();

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

このコードは本当にソースからJavaScriptを取得するためにも機能します!


0

そして、PHPUnit selenium testでは、次のようになります。

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

0

Pythonのリモートコントロールのソリューションに興味がある場合は、innerHTMLを取得する方法を次に示します。

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

助けてくれてありがとう、私はこれを使いました。innerHTML = {solenium selector code}.text作品も全く同じだと思います。
シェーン

0

私が好むレンダリング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
また、driver.find_element_by_tag( "body")を使用して、ページの本文コンテンツにアクセスすることもできます。
Rusty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.