Создание таблицы с помощью веб-скрейпинга с использованием цикла

Я пытаюсь найти в Интернете tax-rates.org, чтобы получить средний процент налога для каждого округа в Техасе. У меня есть список из 255 округов в CSV-файле, который я импортирую как «TX_counties», это таблица с одним столбцом. Мне нужно создать URL-адрес для каждого округа в виде строки, поэтому я устанавливаю d1 в первую ячейку, используя [i,1], затем объединяю ее в строку URL-адреса, выполняю очистку, а затем добавляю +1 к [i], что делает он переходит во вторую ячейку для следующего названия округа, и процесс продолжается.

Проблема в том, что я не могу понять, как сохранить результаты очистки в «растущий список», который я затем хочу превратить в таблицу и сохранить в файл .csv в конце. Я могу очистить только один округ за раз, а затем он перезаписывает сам себя.

есть идеи? (довольно новый для R и очистки в целом)

i <- 1
for (i in 1:255) {

  d1 <- as.character(TX_counties[i,1])

  uri.seed <- paste(c('http://www.tax-rates.org/texas/',d1,'_county_property_tax'), collapse='')

  html <- htmlTreeParse(file = uri.seed, isURL=TRUE, useInternalNodes = TRUE)

  avg_taxrate <- sapply(getNodeSet(html, "//div[@class='box']/div/div[1]/i[1]"), xmlValue)

  t1 <- data.table(d1,avg_taxrate)

  i <- i+1

}

write.csv(t1,"2015_TX_PropertyTaxes.csv")

person Andrew Stephen    schedule 18.11.2015    source источник
comment
Смешивание for (i in 1:255) и i <- i+1 действительно плохой тон (и ненужно, так как часть for увеличивает для вас i)   -  person hrbrmstr    schedule 19.11.2015


Ответы (2)


Это использует rvest, предоставляет индикатор выполнения и использует тот факт, что URL-адреса уже есть для вас на странице:

library(rvest)
library(pbapply)

pg <- read_html("http://www.tax-rates.org/texas/property-tax")

# get all the county tax table links
ctys <- html_nodes(pg, "table.propertyTaxTable > tr > td > a[href*='county_property']")

# match your lowercased names
county_name <- tolower(gsub(" County", "", html_text(ctys)))

# spider each page and return the rate %
county_rate <- pbsapply(html_attr(ctys, "href"), function(URL) {
  cty_pg <- read_html(URL)
  html_text(html_nodes(cty_pg, xpath="//div[@class='box']/div/div[1]/i[1]"))
}, USE.NAMES=FALSE)

tax_table <- data.frame(county_name, county_rate, stringsAsFactors=FALSE)

tax_table
##   county_name              county_rate
## 1    anderson Avg. 1.24% of home value
## 2     andrews Avg. 0.88% of home value
## 3    angelina Avg. 1.35% of home value
## 4     aransas Avg. 1.29% of home value

write.csv(tax_table, "2015_TX_PropertyTaxes.csv")

ПРИМЕЧАНИЕ 1. Я ограничил парсинг до 4, чтобы не снижать пропускную способность сайта, предлагающего бесплатные данные.

ПРИМЕЧАНИЕ 2. На этом сайте доступно только 254 ссылки на налоговые органы округа, поэтому, если у вас 255, кажется, что у вас есть дополнительная ссылка.

person hrbrmstr    schedule 19.11.2015

вы должны сначала инициализировать список для хранения данных, извлеченных с каждым циклом. обязательно инициализируйте его, прежде чем войти в цикл

затем, с каждой итерацией, добавляйте к списку перед началом следующей итерации. посмотри мой ответ здесь

Веб-скрейпинг в R с циклом из data.frame

person matthew matthee    schedule 04.07.2017