Python을 사용하여 Selenium WebDriver에서 WebElement의 HTML 소스 가져 오기


475

Selenium WebDriver를 실행하기 위해 Python 바인딩을 사용하고 있습니다.

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의 셀레늄 웹 드라이버 문서는 기본적으로 존재하지 않으며 해당 기능을 가능하게하는 것으로 보이는 코드는 없습니다.

요소 (및 그 하위 요소)의 HTML에 액세스하는 가장 좋은 방법에 대한 생각이 있습니까?


8
당신은 또한 단지 전체를 구문 분석 할 수 wd.page_sourceBeautifulSoup로와
eLRuLL

답변:


747

요소 innerHTML컨텐츠 소스를 가져 오거나 outerHTML현재 요소 가있는 소스를 얻기 위해 속성을 읽을 수 있습니다 .

파이썬 :

element.get_attribute('innerHTML')

자바:

elem.getAttribute("innerHTML");

씨#:

element.GetAttribute("innerHTML");

루비:

element.attribute("innerHTML")

JS :

element.getAttribute('innerHTML');

PHP :

$element->getAttribute('innerHTML');

테스트하고와 함께 작동합니다 ChromeDriver.


9
innerHTML은 DOM 속성이 아닙니다. 따라서 위의 답변은 효과가 없습니다. innerHTML은 자바 스크립트 자바 스크립트 값입니다. 위의 작업은 null을 반환합니다. nilesh의 대답이 정답입니다.
bibstha

6
이것은 나에게 효과적이며 허용되는 답변보다 훨씬 우아합니다. 셀레늄 2.24.1을 사용하고 있습니다.
Ryan Shillington

22
innerHTML은 DOM 속성은 아니지만 모든 주요 브라우저 ( quirksmode.org/dom/w3c_html.html )에서 잘 지원됩니다 . 그것은 또한 나를 위해 잘 작동합니다.
CuongHuyTo

3
+1 루비에서도 작동하는 것으로 보입니다. 나는 그 getAttribute메소드 (또는 다른 언어에서 동등한 것)가 그 이름이 arg 인 js 메소드를 호출 한다고 생각합니다 . 그러나 문서에 명시 적으로 언급되어 있지 않으므로 nilesh의 솔루션은 대체되어야합니다.
Kelvin

23
에 실패합니다 HtmlUnitDriver. 작동 ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10)와 PhantomJSDriver(나는 다른 사람을 시험하지 않았다).
acdcjunior

91

의 html 소스 코드를 얻는 간단한 방법은 없습니다 webelement. JS를 사용해야합니다. 파이썬 바인딩에 대해서는 확신이 없지만 Java에서는 쉽게 이와 같이 할 수 있습니다. JavascriptExecutor파이썬 에는 클래스 와 비슷한 것이 있어야합니다 .

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

1
이것은 파이썬과 동등하지만 본질적으로 내가 한 일입니다.
Chris W.

8
아래의 element.getAttribute ( "innerHTML") 사용하는 것이 훨씬 읽기 쉽다고 생각합니다. 사람들이 왜 투표를했는지 이해가되지 않습니다.
Ryan Shillington

1
자바 스크립트를 전혀 호출 할 필요가 없습니다. 파이썬에서는 element.get_attribute ( 'innerHTML')를 사용하십시오
Anthon

6
@Anthon innerHTML은 DOM 속성이 아닙니다. 2011 년 에이 질문에 대답했을 때 효과가 없었습니다. 이제 일부 브라우저가 지원하는 것처럼 보입니다. 그것이 효과가 있다면 사용하는 innerHTML것이 더 깨끗합니다. 그러나 모든 브라우저에서 작동한다는 보장은 없습니다.
nilesh

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
지연을 설정하고 최신 소스를 얻을 수 있습니까? 자바 스크립트를 사용하여로드 된 동적 콘텐츠가 있습니다.
CodeGuru

페이지가 완전히로드되지 않은 경우에도 작동합니까? 또한 @FlyingAtom과 같은 지연을 설정하는 방법이 있습니까?
TheRookierLearner

13

Ruby에는 selenium-webdriver (2.32.1)를 사용 page_source하여 전체 페이지 소스를 포함 하는 메소드가 있습니다.


5

실제로 속성 방법을 사용하는 것이 더 쉽고 간단합니다.

Selenium 및 PageObject gem과 함께 Ruby를 사용하여 특정 요소와 연관된 클래스를 얻으려면 행은입니다 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

셀레늄 2.53.0을 가진 자바

driver.getPageSource();

그것은 질문에 대한 것이 아닙니다
Corey Goldberg

웹 드라이버에 따라이 getPageSource메소드는 실제 페이지 소스를 리턴하지 않을 수 있습니다 (예 : 가능한 JavaScript 변경). 리턴 된 소스는 서버가 보낸 원시 소스 일 수 있습니다. 이 점을 확인하려면 웹 드라이버 문서를 확인해야합니다.
Stephan

2

이것이 도움이되기를 바랍니다 : http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

다음은 Java 메소드에 대한 설명입니다.

java.lang.String    getText() 

그러나 불행히도 파이썬에서는 사용할 수 없습니다. 따라서 메소드 이름을 Java에서 Python으로 변환하고 전체 페이지 소스를 얻지 않고 현재 메소드를 사용하여 다른 논리를 시도 할 수 있습니다 ...

예 :

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

6
파이썬에는 실제로 "gettext"와 동등한 기능이 있지만 (단지 "text"속성이라고 생각합니까?) 실제로 HTML 태그 사이에 "plaintext"를 반환하고 실제로 전체 HTML 소스를 반환하지는 않습니다.
Chris W.

2
이것은 Java에서도 일반 텍스트 (html 아님) 만 반환합니다.
Ryan Shillington

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 필요에 따라.

파이썬 :

element.get_attribute('innerHTML')

자바:

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 셀레늄 테스트에서 다음과 같습니다.

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

0

Python의 Remote Control 솔루션에 관심이 있다면 innerHTML을 얻는 방법은 다음과 같습니다.

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

도움 주셔서 감사합니다, 나는 이것을 사용했습니다. 나는 또한 innerHTML = {solenium selector code}.text같은 작품 을 찾습니다 .
Shane

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.