पाइथन का उपयोग करके सेलेनियम वेबड्राइवर में वेबइलमेंट का HTML स्रोत प्राप्त करें


474

मैं सेलेनियम वेबड्राइव चलाने के लिए पायथन बाइंडिंग का उपयोग कर रहा हूं:

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

पायथन के लिए सेलेनियम वेबड्राइवर डॉक्स मूल रूप से अस्तित्वहीन हैं और मुझे उस कोड में कुछ भी नहीं दिखता है जो उस कार्यक्षमता को सक्षम करने के लिए लगता है।

किसी तत्व (और उसके बच्चों) के HTML तक पहुंचने के सर्वोत्तम तरीके पर कोई विचार?


8
तुम भी बस wd.page_sourceसुंदर के साथ सभी पार्स सकता है
eLRuLL

जवाबों:


746

आप तत्व innerHTMLकी सामग्री का स्रोत प्राप्त करने के लिए या outerHTMLवर्तमान तत्व के साथ स्रोत के लिए विशेषता पढ़ सकते हैं ।

अजगर:

element.get_attribute('innerHTML')

जावा:

elem.getAttribute("innerHTML");

सी#:

element.GetAttribute("innerHTML");

माणिक:

element.attribute("innerHTML")

जे एस:

element.getAttribute('innerHTML');

पीएचपी:

$element->getAttribute('innerHTML');

परीक्षण किया और के साथ काम करता है ChromeDriver


9
आंतरिक HTML एक DOM विशेषता नहीं है। तो ऊपर जवाब काम नहीं करेगा। आंतरिक HTML एक जावास्क्रिप्ट जावास्क्रिप्ट जावास्क्रिप्ट मूल्य है। ऊपर करने से अशक्त लौट आएगा। निलेश द्वारा उत्तर उचित उत्तर है।
बिबस्थ

6
यह मेरे लिए बहुत अच्छा काम करता है, और स्वीकृत उत्तर की तुलना में बहुत अधिक सुरुचिपूर्ण है। मैं सेलेनियम 2.24.1 का उपयोग कर रहा हूं।
रयान शिलिंग्टन

22
हालाँकि आंतरिक HTML एक DOM विशेषता नहीं है, लेकिन यह सभी प्रमुख ब्राउज़रों ( quirksmode.org/dom/w3c_html.html ) द्वारा अच्छी तरह से समर्थित है । यह मेरे लिए भी अच्छा काम करता है।
CuongHuyTo

3
+1 यह रूबी में भी काम करता प्रतीत होता है। मुझे लग रहा है कि getAttributeविधि (या अन्य भाषाओं में समतुल्य) सिर्फ js विधि कहती है जिसका नाम है arg। हालाँकि प्रलेखन स्पष्ट रूप से यह नहीं कहता है, इसलिए निलेश का समाधान कमबैक होना चाहिए।
केल्विन

23
इसके लिए विफल रहता है HtmlUnitDriverके लिए काम करता है ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) और PhantomJSDriver(मैं दूसरों का परीक्षण नहीं किया)।
एकड्यूजनिओयर

91

HTML स्रोत कोड प्राप्त करने का वास्तव में सीधा-सीधा तरीका नहीं है webelement। आपको JS का उपयोग करना होगा। मैं अजगर बाँधने के बारे में निश्चित नहीं हूँ लेकिन आप आसानी से जावा में ऐसा कर सकते हैं। मुझे यकीन है कि JavascriptExecutorपायथन में कक्षा के समान कुछ होना चाहिए ।

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

1
यह अनिवार्य रूप से है जो मैंने करना समाप्त कर दिया, यद्यपि पायथन समकक्ष के साथ।
क्रिस डब्ल्यू।

8
मुझे लगता है कि element.getAttribute ("innerHTML") का उपयोग करके नीचे दिए गए उत्तर को पढ़ना बहुत आसान है। मुझे समझ नहीं आता कि लोग इसे क्यों वोट दे रहे हैं।
रयान शिलिंग्टन

1
जावास्क्रिप्ट को कॉल करने की कोई आवश्यकता नहीं है। पायथन में बस element.get_attribute ('innerHTML') का उपयोग करें
Anthon

6
@ एंथन innerHTMLएक डोम विशेषता नहीं है। जब मैंने 2011 में इस प्रश्न का उत्तर दिया, तो यह मेरे लिए काम नहीं करता था, ऐसा लगता है कि अब कुछ ब्राउज़र इसका समर्थन कर रहे हैं। यदि यह आपके लिए काम करता है तो innerHTMLक्लीनर का उपयोग करना है। हालाँकि इसकी कोई गारंटी नहीं है कि यह सभी ब्राउज़रों पर काम करेगा।
नीलेश

2
जाहिर है, यह RemoteWebDriver
Illidan

73

यकीन है कि हम इस स्क्रिप्ट के साथ सभी 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
क्या मैं देरी सेट कर सकता हूं और नवीनतम स्रोत प्राप्त कर सकता हूं? जावास्क्रिप्ट का उपयोग करके गतिशील सामग्री भरी हुई है।
कोडगुरू

क्या यह काम तब भी किया जाता है, जब पेज पूरी तरह से लोड न हो? इसके अलावा, क्या @FlyingAtom की तरह देरी निर्धारित करने का कोई तरीका है?
TheRookierLearner

13

रूबी में, सेलेनियम-वेबड्राइवर (2.32.1) का उपयोग करते हुए, एक page_sourceविधि है जिसमें संपूर्ण पृष्ठ स्रोत होता है।


5

विशेषता विधि का उपयोग करना, वास्तव में, आसान और अधिक सीधे आगे है।

रूबी का उपयोग सेलेनियम और पेजऑब्जेक्ट रत्नों के साथ करने के लिए, एक निश्चित तत्व से जुड़े वर्ग को प्राप्त करने के लिए, रेखा होगी 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')

दोनों मेरे लिए काम कर रहे हैं (सेलेनियम-सर्वर-स्टैंडअलोन-2.35.0)


3

जावा सेलेनियम 2.53.0 के साथ

driver.getPageSource();

यही कारण है कि सवाल नहीं पूछा गया है
कोरी गोल्डबर्ग

वेबड्राइवर के आधार पर, getPageSourceविधि वास्तविक पृष्ठ स्रोत (यानी संभव जावास्क्रिप्ट परिवर्तनों के साथ) वापस नहीं कर सकती है। लौटाया गया स्रोत सर्वर द्वारा भेजा गया कच्चा स्रोत हो सकता है। इस बिंदु को सुनिश्चित करने के लिए वेबड्राइवर डॉक्टर की जाँच की जानी चाहिए।
Stephan

2

मुझे आशा है कि यह मदद कर सकता है: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

यहाँ जावा विधि का वर्णन किया गया है:

java.lang.String    getText() 

लेकिन दुर्भाग्य से यह पायथन में उपलब्ध नहीं है। तो आप जावा से पायथन के लिए विधि नामों का अनुवाद कर सकते हैं और पूरे पृष्ठ स्रोत को प्राप्त किए बिना वर्तमान विधियों का उपयोग करके एक और तर्क की कोशिश कर सकते हैं ...

उदाहरण के लिए

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

6
पाइथन में वास्तव में एक "गेटटेक्स्ट" समतुल्य है (मुझे लगता है कि यह "सिर्फ" टेक्स्ट "विशेषता है?) लेकिन यह वास्तव में HTML टैग्स के बीच केवल" प्लेनटेक्स्ट "लौटाता है और वास्तव में पूर्ण HTML स्रोत नहीं लौटाएगा।
क्रिस डब्ल्यू।

2
यह जावा में केवल सादा पाठ (html नहीं) देता है।
रयान शिलिंगटन

आपको इसे संदर्भित करना चाहिए जैसे आपने कहा था कि एलएम [0] अन्यथा यह काम नहीं करता है
नमस्ते


1

भीतर का HTML चयनित तत्व के अंदर का तत्व लौटाएगा और बाहरी HTML आपके द्वारा चुने गए तत्व के साथ HTML के अंदर वापस आ जाएगा

उदाहरण: - अब मान लीजिये आपका एलिमेंट नीचे है

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

भीतरी HTML तत्व आउटपुट

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

आउटरबॉट एलिमेंट आउटपुट

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

यह कोड वास्तव में जावास्क्रिप्ट को स्रोत से प्राप्त करने के लिए भी काम करता है!


0

और PHPUnit सेलेनियम परीक्षण में यह इस तरह है:

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

0

यदि आप पायथन में रिमोट कंट्रोल के लिए एक समाधान में रुचि रखते हैं, तो यहां बताया गया है कि इनरएचटीएमएल कैसे प्राप्त करें:

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 ("बॉडी") का भी उपयोग कर सकते हैं।
जंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.