2016-06-12 12 views
0

Betrachten Sie eine URL wie https://groups.yahoo.com/api/v1/groups/concatenative/messages/300. Dies ist eine application/json Antwort:Wie bekomme ich die rohe Seitenquelle?

enter image description here

Ich mag würde die JSON von Selen zuzugreifen. (Ich benutze Selenium, weil ich auf private Gruppen zugreifen muss, und ich wollte nicht herausfinden, wie man sich über Mechanicalsoup oder etwas Ähnliches einloggt.) Aber die Seitenquelle zu bekommen gibt mir die Art, wie der Browser ist präsentiert die JSON, nicht die JSON selbst:

>>> self.br.driver.page_source 
'<html xmlns="http://www.w3.org/1999/xhtml"><head><link title="Wrap Long Lines" href="resource://gre-resources/plaintext.css" type="text/css" rel="alternate stylesheet" /></head><body><pre>{"ygPerms":{"resourceCapabilityList":[{"resourceType":"GROUP","capabilities":[{"name":"READ"},{"name":"JOIN"}]},{"resourceType":"PHOTO","capabilities":[]},{"resourceType":"FILE","capabilities":[]},{"resource ... 

Beachten Sie, dass die JSON in einigen HTML und Pre-Elemente gewickelt ist.

Wie kann ich nur die JSON, direkt? Es scheint Hacky zu sein, den Inhalt der <pre> in <body> zu bekommen, da ich nicht weiß, wie der Browser diese JSON-Antwort in Zukunft darstellen soll.

Antwort

1

Sie können AJAX senden, um den Json direkt mit JSExecutor zu erhalten. Siehe Beispiel unten:

driver.get("https://groups.yahoo.com/api/v1/groups/concatenative/messages/300") 
driver.set_script_timeout(10) 
response = driver.execute_async_script(
    "console.log('Start AJAX');" + 
    "var callback = arguments[arguments.length - 1];" + 
    "var http = new XMLHttpRequest();" + 
    "var url = '/api/v1/groups/concatenative/messages/300';" + 
    "http.open('GET', url, true);" + 

    "http.onreadystatechange = function() {" + 
    " if(http.readyState == 4) {" + 
    "  callback(http.responseText);" + 
    " };" + 
    "};" + 
    "http.send();") 
print(response) 
+0

Vielen Dank dafür! Ich habe gesucht, wie man JS- und CSS-Dateien in C# vom ChromeDriver herunterlädt und diese Methode verwendet! Bei der Änderung wurde nur sichergestellt, dass die AsynchronousJavaScript-Zeit auf 5 Sekunden gesetzt wurde, da andernfalls nach null Sekunden ein Timeout auftritt. – Qjimbo

Verwandte Themen