Я пытаюсь выполнить следующую задачу в R. Этот веб-сайт предоставляет статистику уровня подрайона (в таблицах) по сельскохозяйственным данным в Индии: http://agcensus.dacnet.nic.in/tehsilsummarytype.aspx Я понимаю, что это называется динамической формой, поскольку изменения параметров зависят от сделанных записей. В частности, я хотел бы загрузить таблицы для нравлюсь:R - веб-скребковая динамическая форма с входами
- государства = Андхра-Прадеш
- район = Адилабад, Anantapur, Kadapa, ... (8 всего)
- Техсилы = Mancherial, Kasipet (это только 2 примеры для района = Адилабад, всего 158)
Тогда я хочу «Среднее количество холдингов по размеру» для всех социальных групп, всех полов и Всего.
Основываясь на этом сообщении What if I want to web scrape with R for a page with parameters? Я думаю, что путь к использованию - использовать getHTMLFormDescription(). Однако, поскольку моя форма динамична, я не могу следовать маршруту, который был предложен в другом сообщении. Линия createFunction() возвращает ошибку: "* Ошибка в writeFunction (formDescription, символ(), URL, жулик, многословен = многословным,: Вы должны предоставить описание формы здесь См getFormDescription().."
В пакет RHTMLForms, который можно загрузить с веб-страницы omegahat, есть эта функция, которая (как следует из названия) должны делать то, что мне нужно:
function function(desc, omit = character(), drop = TRUE, ..., verbose = FALSE) {
# Discard the elements that we are omitting.
if(length(omit)) {
idx = match(omit, names(desc$elements), 0)
k = class(desc$elements)
desc$elements <- desc$elements[-idx]
class(desc$elements) = k }
# If no more elements left as a result of omitting them, just return the description
# as there are definitely no more dynamic components left.
if(length(desc$elements) == 0)
return(desc)
# Now find the dynamic components.
dyn = sapply(desc$elements, inherits, "DynamicHTMLFormElement")
if(!any(dyn))
return(desc)
pivot = desc$elements[[min(which(dyn))]]
# We will need to submit the form for each value of this dynamic element, so
# get the URI. If the URI changes depending on the value, we are out of luck!!
url = mergeURI(URI(desc$formAttributes["action"]), URI(desc$url))
# Prepare the return value with the pivot information and we will build up
# the branches by looping over the possible values.
descriptions = list(elementName = pivot$name,
description = pivot,
values = list())
omit = c(omit, pivot$name)
for(i in names(pivot$options)) {
# Create the arguments for the submission. We may need to include them all.
args = list(i)
names(args)[1] = pivot$name
if(verbose)
cat("Checking ", pivot$name, " - option", i, "\n")
#XX we may need to provide all the arguments rather than just this one.
# or perhaps cumulate them for the elements we have already deal with.
# We have the defaults and the possible values from the original description.
page = formQuery(args, toString(url), desc, .checkArgs = FALSE, ...)
# Make certain that we turn the checkDynamic off here to avoid recursively.
tmp = getHTMLFormDescription(page, asText = TRUE, handlers = multiFormElementHandlers(url, checkDynamic = FALSE))
tmp = getDynamicHTMLFormDescription(tmp, omit = omit)
# Now remove the elements that we are omitting. This leaves a subset of the form.
if(drop) {
idx = match(omit, names(tmp$elements), 0)
if(any(is.na(idx))) {
k = class(tmp$elements)
tmp$elements = tmp$elements[is.na(idx)]
class(tmp$elements) = k
}
class(tmp) <- c("HTMLFormSubset", class(tmp))
}
descriptions$values[[i]] = tmp
}
class(descriptions) <- c("DynamicFormElementPath")
descriptions
}
Однако, я не могу получить эту работу ни один - call getDynamicHTMLFormDescription («http://agcensus.dacnet.nic.in/tehsilsummarytype.aspx») дает «Ошибка в desc $ elements: оператор $ недействителен для атомных векторов».
Кто-нибудь посоветует, как это сделать? Как только у меня есть способ заполнить форму и получить доступ к таблице для каждого подрайона (tahsil), я знаю, как получить данные в форме. Это действительно только то, что R заполняет эту (конкретную) форму.
Любая помощь приветствуется! Michael Kaiser (штатный научный сотрудник, UCSD)
При выборе «Андхра-Прадеш» выпадающее меню «Район» показывает 23 записи, а не 8, как вы упомянули выше. Было ли это опечаткой или вас интересуют 8 конкретных районов из этих 23? – alex23lemm
Жаль об этом - я должен был быть более конкретным. Да, меня интересуют 8 конкретных из этих 23 районов. –