这是什么类型的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=&currentPage=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文件用数据填充其rowscolumns ,包括医生的照片。

为了保证服务器满意,并非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数据。 使用此方法将精确标记放在本地网页上,包括任何classnamesid's

jsFiddle截图: 在此处输入图像描述

该表是使用此XML形成的