xpath возвращает пустой текст при просмотре веб-страниц в r - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь собрать информацию из https://www.kff.org/interactive/subsidy-calculator. Например, укажите штат = Калифорния, почтовый индекс = 90001, доход = 20000, без покрытия, 1 человек, 1 взрослый, без детей, возраст = 21, неттабак.

Мы получаем следующее: https://www.kff.org/interactive/subsidy-calculator/#state=ca&zip=94704&income-type=dollars&income=20000&employer-coverage=0&people=1&alternate-plan-family=individual&adult-count=1&adults%5B0%5D%5Bage%5D=21&adults%5B0%5D%5Btobacco%5D=0&child-count=0

Я хотел бы получить цифры для "оценочной финансовой помощи" и "вашей стоимости для плана серебра" (они выделены синим цветом в«Результаты» серого поля, по какой-то причине я не могу загрузить скриншот).Когда я использую xpath для чисел, я получаю пустую строку.Это не тот случай, если я должен был получить какой-то другой текст (не в сером поле).Интересно, что может быть не так с этим.Я приложил код ниже.Пожалуйста, прости меня, если это глупый вопрос, так как я очень плохо знаком с веб-копированием.Спасибо!

state = tolower('CA')
zip = 94704
income = 20000
people = 1
adult = 1
children = 0

url = paste0("https://www.kff.org/interactive/subsidy-calculator/#state=", state, "&zip=", zip, "&income-type=dollars&income=", income, "&employer-coverage=0&people=", people, "&alternate-plan-family=individual&adult-count=", adult, "&adults%5B0%5D%5Bage%5D=21&adults%5B0%5D%5Btobacco%5D=0&child-count=", children)

# This returns empty string
r = read_html(url) %>%
      html_nodes(xpath ='//*[@id="subsidy-calculator-new"]/div[5]/div/div/dl/dd[1]/span') %>% html_text()

# This returns "Number of children (20 and younger) enrolling in Marketplace coverage", a line that's not in the grey box.
r = read_html(url) %>%
  html_nodes(xpath = '//*[@id="subsidy-form"]/div[2]/div[3]/div[3]/p') %>%
  html_text()

1 Ответ

0 голосов
/ 26 мая 2019

Значения генерируются с помощью скриптов, которые запускаются на странице. Ваш текущий метод не позволит этого, следовательно, ваш результат. Скорее всего, вам лучше использовать метод, позволяющий запускать сценарии, например RSelenium.

Заполненная вами форма # форма-субсидии передает значения в шаблон в теге сценария # результирующий шаблон Соответствующие расчеты рассматриваются в этом сценарии https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/calculator.js?ver=1.7.7, где вы найдете логику и предварительно установленные значения, такие как черты бедности в год.

Самое простое быстрое представление, вероятно, заключается в проверке переменных javascript при создании нового объекта SubsidyCalculator для обработки формы, то есть js, начинающейся с var sc = new SubsidyCalculator. Вы можете «перепроектировать» эти переменные с вашими значениями плюс значения, возвращенные из json ниже, который я думаю, но не подтвердил, подать 6 переменных, которые начинаются с kff_sc, в соответствии с zipcode, в калькулятор, например. silver: kff_sc.silver. Вы получите представление о приблизительных показателях, если в верхней части сценария указаны значения по умолчанию.

Цифры, относящиеся к почтовому индексу, извлекаются из этого: https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/json/zips/94.json, где последние два числа перед .json - это первые два числа почтового индекса. Вы можете определить это по сценарию проверки ввода: https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/shared.js?ver=1.7.7

var bucket = $( this ).val().substring( 0, 2 );
		if ( kff_sc.buckets[bucket] ) return;
		$.ajax( '/wp-content/themes/vip/kaiser-foundation-2016/interactives/subsidy-calculator/2019/json/zips/' + bucket + '.json', 

Первые две цифры определяют ведро.

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

...