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?
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>
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')
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.
Vous essayez Dryscrape
ce navigateur est entièrement supporté codes js lourds essayez-le j'espère que cela fonctionne pour vous
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
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()