我正在努力让R通过邮政编码完成搜索'具有预定义文本(例如BN1 1NA)的此网页http://cti.voa.gov.uk/cti/上的字段,前进到下一页并刮取生成的4列表,根据邮政编码,该表可以在多个页面上。为了使其更加复杂,“改进”指标'不是文本字段,而是图像文件(如果使用邮政编码BN1 3HP进行搜索,则会看到)。我希望此列包含0或1,具体取决于图像是否存在。
最终,我正在使用一个很好的数据框来反映屏幕上的4列。
我试图修改此question的建议,以便在没有运气的情况下完成我上面描述的内容,并且说实话,我试图破译这个建议。
我意识到R可能不是最适合我需要做的事情,但它是我可以获得的全部内容。任何帮助将不胜感激。
答案 0 :(得分:4)
我不确定美国之音网站的T& C对刮痧的看法,但是这段代码可以完成这项工作:
library("httr")
library("rvest")
post_code <- "B1 1"
resp <- POST("http://cti.voa.gov.uk/cti/InitS.asp?lcn=0",
encode = "form",
body = list(btnPush = 1,
txtPageNum = 0,
txtPostCode = post_code,
txtRedirectTo = "InitS.asp",
txtStartKey = 0))
resp_cont <- read_html(resp)
council_table <- resp_cont %>%
html_node(".scl_complex table") %>%
html_table
Firebug有一个出色的“网络”面板,可以看到POST标头。大多数现代浏览器也内置了类似的内容。
答案 1 :(得分:4)
我使用RSelenium取消埃克塞特邮政编码的议会税单:
library(RSelenium)
library(RCurl)
input = 'EX4 2NU'
appURL <- "http://cti.voa.gov.uk/cti/"
RSelenium::startServer()
remDr <- remoteDriver()
remDr$open()
Sys.sleep(5)
remDr$navigate(appURL)
search.form <- remDr$findElement(using = "xpath", "//*[@id='txtPostCode']")
search.form$sendKeysToElement(list(input, key = "enter"))
doc <- remDr$getPageSource()
tbl = xpathSApply(htmlParse(doc[[1]]),'//tbody')
temp1 = readHTMLTable(tbl[[1]],header=F)
v = length(xpathSApply(htmlParse(doc[[1]]),'//a[@class="next"]'))
while (v != 0) {
nextpage <- remDr$findElement(using = "xpath", "//*[@class = 'next']")
nextpage$clickElement()
doc <- remDr$getPageSource()
tbl = xpathSApply(htmlParse(doc[[1]]),'//tbody')
temp2 = readHTMLTable(tbl[[1]],header=F)
temp1 = rbind(temp1,temp2)
v = length(xpathSApply(htmlParse(doc[[1]]),'//a[@class="next"]'))
}
finaltable = temp1
希望你觉得它有用。有了这个,您可以废弃多个页面数据。