mtb*_*r75 6 html javascript jquery r web-scraping
我正试图在这个链接中提取数据,http://www.rchsd.org/doctors/index.htm?strt = 0&ln =&fn =&sp =&grp =< = ln =< =< =,R但这很难.
我注意到,每当我点击页码时,网址链接都不会改变.这个表是用JavaScript创建的吗?该表是由某些外部源创建的,我如何才能访问它?此外,这种类型的表有技术名称吗?
另外,谁知道网页抓取与R或任何其他程序,你会如何提取此表中的所有数据?我尝试使用以下代码R来提取数据,但我得到了NULL.你会如何解决这个问题?
mps <- paste("http://www.va.gov/providerinfo/SANDIEGO/index.asp?servicesearch=&specialtysearch=&gendersearch=&sort=¤tPage=1")
mps.doc <- htmlParse(mps)
mps.tabs <- readHTMLTable(mps.doc)
Run Code Online (Sandbox Code Playgroud)
另外,如果你不能解决我问题的后半部分,那也没关系.我主要想知道我问题上半部分的答案.
回答使用3种不同的技术进行修订,所有技术都基于.ajax()和YQL.
参考HTML: http ://doctors.ucsd.edu/?index = 1
对于问题的第一部分,您提供的URL中的表类型是标准的HTML表模型.在创建时table,网站使用XML文件填充数据rows和columns数据,包括医生的照片.
为了保持服务器满意,并非XML文件中的所有数据都加载到浏览器中,只显示有限的结果,并带有进入下一页的选项.
对于您撰写的评论部分(即http://doctors.ucsd.edu/?index=1)中的URL链接也是如此,其中访问者可以从网页每页结果下拉列表中选择10,25或50个结果菜单.该网站的地址栏会显示该号码请求通过&setsize=25例如.
虽然您可能希望数据抓取该引用URL,但最好不要因为您已经拥有包含所需数据的XML文件.直接访问它的工作量减少了!
参考XML: http ://www.rchsd.org/api/physdir/
问题的第二部分很容易,因为XML文件随时可用.这一次,当你的数据刮到参考XML文件时,它将显示你想要的信息,并且具有很高的可读性.
在上面的两个数据抓取查询中,我已将请求限制为5个结果用于测试目的,但您可以将其增加到更大的采样值.第一个示例中的额外网页数据量需要使用XPATH映射节点并需要额外处理才能使用该数据.
我准备了一个详细的jsFiddle,它可以解释你对这个过程的很多疑问.在其中,我将解释如何使用YQL .ajax(),以及XML文件的链接.
参考例:
$.ajax({
type: 'GET',
url: 'http://query.yahooapis.com/v1/public/yql?q=SELECT%20phys%20FROM%20xml%20WHERE%20url%3D%22http%3A%2F%2Fwww.rchsd.org%2Fapi%2Fphysdir%2F%22%20LIMIT%205',
dataType: 'xml',
success: function(data) {
var dataResults = $(data).find('results');
console.log(dataResults);
}
});
Run Code Online (Sandbox Code Playgroud)
参考教程:
jsFiddle Data Scraping XML演示(参见下面的jsFiddle HTML演示)
编辑:返回原始参考HTML:http://doctors.ucsd.edu/?index = 1
我在第一部分写的最后一件事实际上并不正确,因为你不一定拥有你需要的所有数据.虽然您可以从XML文件中的物理医生地址创建自己的Google地图位置数据,但该信息已可供使用.
然后还发现此URL还包含一个唯一格式化的缩略图图像,并在可用时包含" 医生信息"部分.
那么接下来是一个重写的jsFiddle,它显示了如何抓取HTML网页的数据.您将在这个新的jsFiddle中注意到YQL语句不再存在,ACCESS phys FROM xml因为我们现在正在处理HTML文档.此外,我们将在该YQL语句中使用通配符*而不是标记名.那将是physACCESS * FROM html
正如您记得上面的数据抓取第一种方法,从该请求返回的数据太多.我将解释如何添加XPATH到该YQL语句,以便您只获得所需的数据.
从哪里开始问你?在浏览器中的该网站!我将继续使用Firefox.
首先,让我们在测试中强制返回5个结果.要执行此操作,请将每页结果更改为25,然后在浏览器栏中将25更改为5以进行&setsize=查询.点击键盘上的Enter键以应用更改.
使用网页其他搜索条件,显示更多特色,位置和排序结果:还将修改浏览器栏并进一步创建要使用的自定义URL.
对于我们的演示,我们只需要另外一个自定义排序结果:姓氏AZ.如果需要,请重新加载网页,并确保...我们的自定义网址应如下所示:
http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5
现在网页上填充了我们要求的5个结果,我们需要看看布局如何支持这些项目.
通过右键单击鼠标来使用Firefox Inspect Element工具来查看和学习表格布局结构.很快,您将看到返回的所有结果都包含在一个唯一的类名中.
以下是使用Firefox进行说明的屏幕截图:

当弹出的HTML面板在底部通过图标的检查元素工具(检查元素图标的右侧),你可以看到的layout是针对单个医生盒:

在上面的照片中,您可以在视觉上 遍历DOM,以查看主类名 resultsList是div持有请求的5个结果.可以使用该实际的类名,但要使用的更精确的类名是resultsListProvider每个返回的项所携带的.
您现在拥有构造要使用的YQL语句所需的信息.首先,这是我们开始使用的最小值:
ACCESS * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5"
Run Code Online (Sandbox Code Playgroud)
上面真的不会这样做,因为它返回了太多非必要的网页数据,这就是为什么我们使用Inspect Element来发现真正重要的东西.话虽这么说,我们将使用XPATH通过classname 访问我们需要的网页部分resultsListProvider.
xpath="//div[@class='resultsListProvider']"
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用两个部分组合AND来创建我们可以数据抓取的最终YQL语句:
SELECT * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5" AND xpath="//div[@class='resultsListProvider']"
Run Code Online (Sandbox Code Playgroud)
上面的最终YQL语句现在将提供可用的结果,以便在我创建的新jsFiddle中使用,该jsFiddle已更新注释以反映这些更改.如果需要,可以将XML文件和HTML URL方法结合使用,以满足您的数据抓取要求,因为每种方法都提供其他方法可能缺少的内容.
提醒:当网页加载或使用YQL Rest State查询时,可能会直接呈现某些数据.这意味着您的动态数据可能基于其动态数据.天啊!
参考教程:
jsFiddle Data Scraping HTML演示(参见上面的jsFiddle XML演示)
编辑2:直接使用HTML
jsFiddle Data Scraping HTML演示:克隆该网页
最新的编辑显示了如何使用原始网页的样式表(可选,您可以创建自己的样式表),但使用dataType属性以不同方式请求Ajax数据.使用此方法将精确标记放在本地网页上,包括任何classnames或id's与之相关的标记.
jsFiddle截图:
