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?
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
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')
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.
Sie versuchen Dryscrape
dieser Browser wird vollständig unterstützt. Schwere js-Codes. Versuchen Sie es. Ich hoffe, es funktioniert für Sie
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
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()