web-dev-qa-db-fra.com

Comment obtenir du code source HTML avec JavaScript en utilisant sélénium

Je lance une requête sur une page Web, puis l’URL des résultats est obtenue. Si je fais un clic droit voir source HTML, je peux voir le code HTML généré par JS. Si j'utilise simplement urllib, python ne pourra pas obtenir le code JS. Je vois donc une solution utilisant Selenium. Voici mon 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!!

Voici le code source dont j'ai besoin dans la fenêtre du clic droit (je veux la partie INFORMATIONS)

</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"});
        });

=========== Ma question est donc ===============. Comment obtenir les informations générées par JS?

22
MacSanhe

Vous aurez besoin d'obtenir le document via javascript vous pouvez utiliser la fonction sélénium execute_script

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

Cela obtiendra tout à l'intérieur de la balise <html>

28
Victory

Il n'est pas nécessaire d'utiliser cette solution de contournement, vous pouvez utiliser à la place:

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

Je pense que vous obtenez le code source avant que JavaScript ait rendu le code HTML dynamique.

Dans un premier temps, essayez d’attendre quelques secondes entre les sources de navigation et d’obtention de la page.

Si cela fonctionne, vous pouvez changer de stratégie d’attente.

1
Robbie Wareham

Vous essayez Dryscrape ce navigateur est entièrement supporté codes js lourds essayez-le j'espère que cela fonctionne pour vous 

1
Harry1992

J'ai rencontré le même problème et finalement résolu par désirés capacités.

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

J'ai le même problème pour obtenir du code source Javascript à partir d'Internet et je l'ai résolu en utilisant la suggestion de Victory ci-dessus.

* D'abord, execute_script

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

* Deuxièmement, analyser le code HTML en utilisant beautifulsoup (vous pouvez télécharger la commande beautifulsoup par pip)

 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.

* Troisièmement, imprimez la valeur dont vous avez besoin

 for span in viewcount:
    print(span.string) 

* Code complet

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