web-dev-qa-db-de.com

Wie man mit Javascript gerenderten Quellcode in HTML mit Selen erhält

Ich führe eine Abfrage auf einer Webseite aus und erhalte die Ergebnis-URL. Wenn ich mit der rechten Maustaste auf html source klickt, kann ich den von JS generierten html-Code sehen. Wenn ich einfach urllib verwende, kann Python den JS-Code nicht abrufen. Ich sehe also eine Lösung mit Selen. Hier ist mein Code:

from Selenium import webdriver
url = 'http://www.archives.com/member/Default.aspx?_act=VitalSearchResult&lastName=Smith&state=UT&country=US&deathYear=2004&deathYearSpan=10&location=UT&activityID=9b79d578-b2a7-4665-9021-b104999cf031&RecordType=2'
driver = webdriver.PhantomJS(executable_path='C:\python27\scripts\phantomjs.exe')
driver.get(url)
print driver.page_source

>>> <html><head></head><body></body></html>         Obviously It's not right!!

Hier ist der Quellcode, den ich in Rechtsklickfenstern benötige (ich möchte den Informationsteil)

</script></div><div class="searchColRight"><div id="topActions" class="clearfix 
noPrint"><div id="breadcrumbs" class="left"><a title="Results Summary"
href="Default.aspx?    _act=VitalSearchR ...... <<INFORMATION I NEED>> ... 
to view the entire record.</p></div><script xmlns:msxsl="urn:schemas-Microsoft-com:xslt">

        jQuery(document).ready(function() {
            jQuery(".ancestry-information-tooltip").actooltip({
href: "#AncestryInformationTooltip", orientation: "bottomleft"});
        });

============ Meine Frage ist also ================.... Wie bekomme ich die von JS generierten Informationen?

22
MacSanhe

Sie müssen das Dokument über javascript erhalten, Sie können die Selenium execute_script-Funktion verwenden

from time import sleep # this should go at the top of the file

sleep(5)
html = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")
print html

Dadurch wird alles in das <html>-Tag eingefügt

28
Victory

Es ist nicht notwendig, diese Problemumgehung zu verwenden. Sie können stattdessen Folgendes verwenden:

driver = webdriver.PhantomJS()
driver.get('http://www.google.com/')
html = driver.find_element_by_tag_name('html').get_attribute('innerHTML')
8
Darius M.

Ich denke, Sie erhalten den Quellcode, bevor JavaScript den dynamischen HTML-Code gerendert hat.

Versuchen Sie zunächst, einige Sekunden zwischen dem Navigieren und dem Abrufen der Seitenquelle zu schlafen.

Wenn dies funktioniert, können Sie zu einer anderen Wartestrategie wechseln.

1
Robbie Wareham

Sie versuchen Dryscrape dieser Browser wird vollständig unterstützt. Schwere js-Codes. Versuchen Sie es. Ich hoffe, es funktioniert für Sie 

1
Harry1992

Ich bin auf das gleiche Problem gestoßen und habe es endlich von desire_capabilities gelöst.

from Selenium import webdriver
from Selenium.webdriver.common.proxy import Proxy
from Selenium.webdriver.common.proxy import ProxyType

proxy = Proxy(
     {
          'proxyType': ProxyType.MANUAL,
          'httpProxy': 'ip_or_Host:port'
     }
)
desired_capabilities = webdriver.DesiredCapabilities.PHANTOMJS.copy()
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)
driver.get('test_url')
print driver.page_source
0
Vida

Ich habe das gleiche Problem, Javascript-Quellcode aus dem Internet zu bekommen, und ich habe ihn mit dem Vorschlag von Victory gelöst.

* Zuerst ausführen_script

driver=webdriver.Chrome()
driver.get(urls)
innerHTML = driver.execute_script("return document.body.innerHTML")
#print(driver.page_source)

* Zweitens, HTML-Analyse mit beautifulsoup (Sie können den Befehl beautifulsoup per pip herunterladen)

 import bs4    #import beautifulsoup
 import re
 from time import sleep

 sleep(1)      #wait one second 
 root=bs4.BeautifulSoup(innerHTML,"lxml") #parse HTML using beautifulsoup
 viewcount=root.find_all("span",attrs={'class':'short-view-count style-scope yt-view-count-renderer'})   #find the value which you need.

* Drittens drucken Sie den gewünschten Wert aus

 for span in viewcount:
    print(span.string) 

* Vollständiger Code

from Selenium import webdriver
import lxml

urls="http://www.archives.com/member/Default.aspx?_act=VitalSearchResult&lastName=Smith&state=UT&country=US&deathYear=2004&deathYearSpan=10&location=UT&activityID=9b79d578-b2a7-4665-9021-b104999cf031&RecordType=2"

driver = webdriver.PhantomJS()


##driver=webdriver.Chrome()
driver.get(urls)
innerHTML = driver.execute_script("return document.body.innerHTML")
##print(driver.page_source)

import bs4
import re
from time import sleep

sleep(1)
root=bs4.BeautifulSoup(innerHTML,"lxml")
viewcount=root.find_all("span",attrs={'class':'short-view-count style-scope yt-view-count-renderer'})


for span in viewcount:
print(span.string)

driver.quit()
0
kuo chang