在R中进行网页抓取时,xpath返回空文本

时间:2019-05-26 11:46:10

标签: css r web-scraping

我正在尝试从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 :(得分:0)

这些值是通过页面上运行的脚本生成的。您当前的方法不允许这样做,因此您的结果。使用允许运行脚本的方法(例如RSelenium)可能会更好。

您完成的表单#subsidy-form将值输入到脚本标签#results-template中的模板中。脚本https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/calculator.js?ver=1.7.7涵盖了相关的计算,您将在其中找到逻辑和预设值,例如每年的贫困线。

最简单的快速视图可能是在创建新的SubsidyCalculator对象以处理表单(即以var sc = new SubsidyCalculator开头的js)时检查javascript变量。您可以使用值加上从json返回的值(我认为是但尚未确认)对这些变量进行“反向工程”,根据邮政编码,将kff_sc开头的6个变量馈入计算器,例如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', 

前两位数字确定存储桶。

总而言之,您可能会实现自己的计算器,但是您将重新发明轮子。似乎只需将浏览器自动化然后提取结果值就容易得多。