2

Das Problem tabellarische Daten aus http://www.nasdaqomx.com/commodities/market-pricesWeb mit PhantomJS/Selen (aus R) Schaben Element Einstellwerte

Schaben-I-Daten bekommen, aber ich kann nicht/set Parameter erscheint auf der Seite zu ändern, und so retrive andere Daten.

Dies sind die ids ich auf der Seite finden:

'#marketSelectId, #typesSelectId, #productsSelectId, # dateId, # isTraded, #excelId'

Und diejenigen, die ich ändern müssen scheint sein (Selektor Gadet aus Chrom):

'#marketSelectId, #isTraded' (Code von der Webseite am Ende)

Jede Hilfe, wie man diese ändern.

Mein PhantomJS Versuch ist folgende: // phantomNasdaqOmx.js

var webPage = require('webpage'); 
var page = webPage.create(); 

var fs = require('fs'); 
var path = 'NasdaqOmx.html'; 

page.open('http://www.nasdaqomx.com/commodities/market-prices/history/', 
function (status) { 

// no luck 
// page.evaluate(function(){ 
// document.getElementById("#isTraded").value = false; 
// }); 

// no luck 
// $('.myCheckbox').removeAttr('checked'); 

// no luck 
page.evaluate(function(){ 
document.getElementById('marketSelectId').value='EUK'; 

}); 

var content = page.content; 
fs.write(path,content,'w'); 

phantom.exit(); 
}); 

Mein Rselenium Versuch

require('RSelenium') 
library('XML') 

remDr <- remoteDriver(remoteServerAddr = "localhost" 
        , port = 32770L 
        , browserName = "firefox" 
) 

remDr$open() 

site <- "http://www.nasdaqomx.com/commodities/market-prices" # create URL for each page to scrape 
remDr$navigate(site) # navigates to webpage 
## remDr$findElements(using = 'xpath', value = '//*@id') 
remDr$executeScript("document.getElementById('marketSelectId').setAttribute('value', 'EUK')") 

remDr$executeScript("document.getElementById('isTraded').setAttribute('value', '')"); 
##a <- remDr$executeScript("document.getElementById('isTraded').getAttribute('value')") 
## remDR$ findElement(By.id("isTraded")).getAttribute("value"); 
## 
## Throws error 
## remDr$click(buttonId = 'isTraded') 

elem <- remDr$findElement(using="id", value="derivatesNordicOutput") # get big table in text string 

## elem$highlightElement() # just for interactive use in browser. not necessary. 
elemtxt <- elem$getElementAttribute("outerHTML")[[1]] # gets us the HTML 
elemxml <- htmlTreeParse(elemtxt, useInternalNodes=T) # parse string into HTML tree to allow for querying with XPath 
readHTMLTable(elemxml) 

head(master) 

marketSelectId - benötigten Werte und Skriptinformationen: 'eno', 'ede', 'euk'

//*[(@id = "marketSelectId")] 
webpage js code 
<label>Market:</label> <select id="marketSelectId"> 
    <!--optgroup label="Electricity"--> 
    <option selected="selected" value="ENO">Electricity Nordic</option> 
    <option value="EBE">Electricity Belgium</option> 
    <option value="EFR">Electricity France</option> 
    <option value="EDE">Electricity Germany</option> 
    <option value="EIT">Electricity Italy</option> 
    <option value="ENL">Electricity Netherlands</option> 
    <option value="EES">Electricity Spain</option> 
    <option value="EUK">Electricity UK</option> 
    <!--/optgroup--> 
    <option value="EUA">Carbon Market</option> 
    <option value="ZEE">Natural Gas Belgium</option>   
    <option value="PNO">Natural Gas France</option> 
    <option value="GPO">Natural Gas Germany</option> 
    <option value="TTF">Natural Gas Netherlands</option> 
    <option value="NGUK">Natural Gas UK</option> 
    <!--option value="ELEUR">Electricity Certificates</option--> 
    <option value="ELSEK">Swedish Electricity Certificate</option> 
    <option value="NCFO">Fuel Oil</option> 
    <option value="NCDF">Freight - Dry</option> 
    <option value="NCTC">Freight - Tankers Clean</option> 
    <option value="NCTD">Freight - Tankers Dirty</option> 
    <!--option value="COAL">Coal</option--> 
    <option value="NCSF">Seafood</option> 
    <option value="STEEL">Steel</option> 
    <option value="NCIO">Iron Ore</option> 
    <option value="RWEU">Renewables</option> 
    <option value="COKCOAL">Coking Coal</option> 
</select> 

isTraded - Skriptinformationen und Wunsch nicht wissen, den richtigen Wert für dieses Feld ‚abgehakt‘ zu aus kontrolliert zu ändern, (do, scheint der Code für ‚geprüft‘ und anderes zu überprüfen, aber das ist nicht

//*[(@id = "isTraded")] 
webpage js code 
     // only those who have oi or volume 
    if ($("#isTraded").is(":checked")) { 
     xpath += "[ph/hi/@rv!='' or ph/hi/@tv!='']"; //or ph/hi/@oi!='' 

Antwort

2

Sie die clickElement verwenden müssen nicht funktioniert Methode. Sie können auch die selectTag Methode verwenden, wählen Sie Menüs

library(RSelenium) 
library(XML) 
rD <- rsDriver() 
remDr <- rD[["client"]] 
remDr$navigate("http://www.nasdaqomx.com/commodities/market-prices") 
isTraded <- remDr$findElement("id", "isTraded") 
isTraded$clickElement() 
waitforupdate(remDr) 
marketSelect <- remDr$findElement("id", "marketSelectId") 
msSelect <- marketSelect$selectTag() 
# select seafood market 
seafood <- msSelect$elements[msSelect$text == "Seafood"][[1]] 
# switch to seafood market 
seafood$clickElement() 
waitforupdate(remDr) 
elem <- remDr$findElement(using="id", value="derivatesNordicOutput") # get big table in text string 

## elem$highlightElement() # just for interactive use in browser. not necessary. 
elemtxt <- elem$getElementAttribute("outerHTML")[[1]] # gets us the HTML 
elemxml <- htmlTreeParse(elemtxt, useInternalNodes=T) # parse string into HTML tree to allow for querying with XPath 
readHTMLTable(elemxml) 

# function to wait for update to appear 
waitforupdate <- function(remDr, maxwait = 30){ 
    chk <- FALSE 
    count <- 0L 
    while(!chk && count < maxwait){ 
    count <- count + 1L 
    res <- suppressMessages(
     tryCatch({ 
     remDr$findElement("css", "#derivatesNordicOutput span[title = 'Last update']") 
     }, 
     error = function(e){e} 
    ) 
    ) 
    chk <- !inherits(res, "error") 
    Sys.sleep(1L) 
    } 
    if(count >= maxwait){ 
    stop("table has not updated in alloted time") 
    } 
} 

# UPDATE get german electric prices 
gerElec <- msSelect$elements[msSelect$text == "Electricity Germany"][[1]] 
gerElec$clickElement() 
waitforupdate(remDr) 
elem <- remDr$findElement(using="id", value="derivatesNordicOutput") # get big table in text string 
elemtxt <- elem$getElementAttribute("outerHTML")[[1]] # gets us the HTML 
elemxml <- htmlTreeParse(elemtxt, useInternalNodes=T) # parse string into HTML tree to allow for querying with XPath 
readHTMLTable(elemxml) 


# close browser and stop server 
remDr$close() 
rD[["server"]]$stop() 
+0

Dank @jdharrison zu manipulieren, noch ein paar Probleme, die mit ihm richtig hinzubekommen. Der Code funktioniert, aber mit ein paar Macken, die Funktion 'waitforupdate()' manchmal sperren, ich weiß nicht, ob dies ia Windows-Problem, Versuchen Sie, den entsprechenden Schlüssel: ie: 'Meeresfrüchte <- msSelect $ elements [msSelect $ text == "Seafood"] [[1]] ' Gibt mir die Meeresfrüchte-Werte, aber mit dem' Electricity Germany 'geben Sie mir diese Werte nicht, sondern geben Sie die' Electricity Nordic ', versuchen mit Ihr Vorschlag aber mit Wert: 'Meeresfrüchte <- msSelect $ Elemente [msSelect $ Wert == "EUK"] [[1]]' Aber das hilft auch nicht. Danke – Thorvall

+0

@Thorvall Ich kann Ihre Probleme nicht replizieren. Ich habe Code hinzugefügt, um deutsche elektrische Preise zu erhalten. – jdharrison

+0

Habe meine Selenium-Instanz von einem Firefox zu einem Chrome-basierten Docker-Container geändert, und jetzt funktioniert es. Kann nicht feststellen, ob es sich um ein Problem mit Firefox handelt oder nur, wenn es über einen Andock-Container unter Windows ausgeführt wird. Danke. – Thorvall