这是什么类型的HTML表格,您可以使用哪种类型的网页抓取技术?
我试图在这个链接中提取数据, http://www.rchsd.org/doctors/index.htm?strt = 0&ln =&fn =&sp =&grp =&loc =&lng =&gen = ,用R
但它更确切难。
我注意到,每当我点击页码时,url链接都不会改变。 这个表是用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)
另外,如果你不能解决我问题的后半部分,那也没关系。 我主要想知道我问题上半部分的答案。
回答使用3种不同的技术进行修改,所有技术都基于.ajax()和YQL。
技术1
参考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); } });
参考教程:
jsFiddle Data Scraping XML Demo ( 参见下面的jsFiddle HTML Demo )
技术2
编辑:返回原始参考HTML: http : //doctors.ucsd.edu/?index = 1
我在第一部分写的最后一件事 实际上并不正确 ,因为你不一定拥有你需要的所有数据。 虽然您可以从XML文件中的物理医生地址创建自己的Google地图位置数据 ,但该信息已可供使用。
然后还发现此URL还包含唯一格式化的缩略图图像,并在可用时包含“ 医生信息”部分。
那么,接下来是重写的jsFiddle,它显示了如何抓取HTML网页的数据。 你会在这个新的jsFiddle中注意到YQL语句不再是ACCESS phys FROM xml
因为我们现在处理的是HTML文档。 此外,我们将在该YQL语句中使用通配符*
而不是tagname phys
。 然后它将是ACCESS * FROM html
正如您记得上面的数据抓取第一种方法 ,从该请求返回的数据太多。 我将解释如何将XPATH
添加到该YQL语句中,这样您才能获得所需的数据。
从哪里开始问你? 在浏览器中的该网站! 我将继续使用Firefox。
首先,让我们在测试中强制返回5个结果。 要执行此操作,请将每页结果更改为25,然后在浏览器栏中将&setsize=
query更改为25到5。 点击键盘上的Enter键以应用更改。
使用网页其他搜索条件 , 显示更多特色 , 位置和排序结果:还将修改浏览器栏并进一步创建要使用的自定义URL。
对于我们的演示,我们只需要另外一个自定义排序结果:姓氏AZ 。 如果需要,请重新加载网页,并确保…我们的自定义url应如下所示:
http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5
现在网页上填充了我们要求的5个结果,我们需要看看布局如何支持这些项目。
通过右键单击鼠标来使用Firefox Inspect Element工具来查看和学习表格布局结构 。 很快,您将看到返回的所有结果都包含在一个唯一的类名中 。
以下是使用Firefox进行说明的屏幕截图:
通过Inspect Element工具底部的图标弹出 HTML面板 ( 到Inspect Element Icon的右侧 ),您可以看到该单个Doctors框的layout
:
在上面的照片中,您可以在视觉上 遍历DOM以查看主类名 resultsList
是包含所请求的5个结果的div
。 可以使用实际的类名,但要使用的更精确的类名是每个返回的项所携带的resultsListProvider
。
您现在拥有构造要使用的YQL语句所需的信息。 首先,这是我们开始使用的最小值:
ACCESS * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5"
上面真的不会这样做,因为它返回了太多非必要的网页数据,这就是为什么我们使用Inspect Element来发现真正重要的东西。 话虽这么说,我们将使用XPATH
通过classname resultsListProvider
访问我们需要的网页部分。
xpath="//div[@class='resultsListProvider']"
现在我们可以使用AND
组合这两个部分来创建我们可以数据抓取的最终YQL语句 :
SELECT * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5" AND xpath="//div[@class='resultsListProvider']"
上面的最终YQL语句现在将提供可用的结果,以便在我创建的新jsFiddle中使用,该jsFiddle已更新注释以反映这些更改。 如果需要,您可以结合XML文件和HTML URL方法来满足您的数据抓取要求,因为每种方法都提供其他方法可能缺少的内容。
提醒:当网页加载或使用YQL Rest State查询时,可能会直接呈现某些数据。 这意味着您的动态数据可能基于其动态数据 。 天啊!
参考教程:
jsFiddle Data Scraping HTML Demo ( 参见上面的jsFiddle XML Demo )
技术3
编辑2:直接使用HTML
jsFiddle Data Scraping HTML演示:克隆该网页
最新的编辑显示了如何使用原始网页的样式表( 可选,您可以创建自己的样式表),但使用dataType
属性以不同方式请求Ajax数据。 使用此方法将精确标记放在本地网页上,包括任何classnames
或id's
。
jsFiddle截图:
该表是使用此XML形成的