本文用来讲解xpath的入门基础,适合对八爪鱼已经有一些基础的用户来学习,本文以采集黄页88企业信息举例说明。

 

一、XPath是什么


简单的说,XPath是在用于查找和定位我们所需数据的一种路径。举个例子,我们把网页源码比作一张地图,XPath就是地图的上一条条的路。我们从深圳到北京即可走京广线也可以走京九线,可以有多条路线到达目的地。同样我们在网页上要精确查找所需数据时,就是利用网页上的路线--XPath来实现的,对于某个数据可以有多个XPath查找到它,找一个适合我们的就行。


XPath是专门针对XML设计的,在复杂结构化数据中查找信息的语言,而我们的网页实质上是HTML的文档,那如何对网页执行XPath查询呢?八爪鱼采集器内部有一套针对HTML的XPath引擎,使得直接用XPath就能精准的查找定位网页里面的数据。

 

二、查看XPath的方法

 

通过火狐浏览器中的Firebug和FirePath插件,可以很方便地查看XPath。

 

首先在电脑上先安装火狐浏览器,然后打开火狐浏览器右上角的打开菜单按钮,选择添加组件。


图1


注:火狐浏览器需是55版本以下,安装完成后需禁止更新。

 

这里提供一个54版本的下载地址:
64位火狐54:http://ftp.mozilla.org/pub/firefox/releases/54.0.1/win64/zh-CN/
32位火狐54:http://ftp.mozilla.org/pub/firefox/releases/54.0.1/win32/zh-CN/


Chrome浏览器有类似插件XPath Helper,其没有版本限制,可自行百度并下载使用。

 

在弹出的对话框中搜索firebug组件,搜索出来之后选择安装。


图2


安装成功之后同样的方式搜索firepath进行安装。


小贴士:安装成功之后,浏览器需要重启一下才能完全安装成功。重新打开浏览器中,可以看到多了一个昆虫按钮,代表安装成功。


在浏览器中打开一个网页,再点击浏览器中的firebug按钮,就弹出了可以用xpath的firepath工具。


1


按照下面的操作可以找到数据的精确位置。


点击firepath工具中“查看页面中的元素”按钮→选择网页中要提取的字段→可以看到firepath工具中显示出了xpath路径


2


三、在八爪鱼中查看、修改XPath

 

八爪鱼采集器内部有一套针对HTML的XPath引擎,直接用XPath就能精准的查找定位网页里面的数据,从而进行数据提取。在八爪鱼中进行规则配置的时候,会自动生成定位数据的XPath,一般没有问题能够正常使用。但当八爪鱼自动生成的XPath不能满足需求的时候,则需要我们手动修改XPath,以正确定位到网页中的数据。

在八爪鱼规则配置中,除了打开网页步骤没有XPath外,其他步骤都涉及到XPath定位。

 

四、在八爪鱼中修改XPath演示

 

示例地址:

http://b2b.huangye88.com/qiye2309554/
http://b2b.huangye88.com/qiye2275810/


采集需求:提取两个网页中的公司名称和地址字段

 

步骤1:点击新建任务→自定义采集,进入到任务配置页面:

然后输入要采集的两个网址→保存网址,系统会进入到流程设计页面并自动打开前面输入的网址。


3


步骤2:然后进行数据字段的提取,鼠标点击页面中要提取的“公司地址”字段,这里字段就被选中了并通过红色框表示,然后在弹出的提示框中选择“采集该元素的文本”表明要采集的是页面中的文本数据。用同样的方式提取“公司名称”字段。


4


步骤3 :这样提取完毕之后我们可以点一下流程按钮,然后修改字段名称。这里的字段名称相当于表头,便于采集时区分每个字段类别。在下面界面中修改字段名称,修改完成之后,点击“确定”保存。


5


步骤4:点击“保存并启动”,再在弹出的对话框中选择“启动本地采集”。系统会在本地电脑上开启一个采集任务并采集数据,任务采集完毕之后会弹出一个采集结束的提示,可以看到采集完之后第二条数据的公司地址采集是错误的,采集到的并不是公司地址而是主营产品。


6


步骤5 :这时候回到客户端上手动执行这个规则,选择第二条URL,再点提取数据可以公司地址就本身提取到的是主营产品。这是因为,由于网页结构并不一定是完全相同的,八爪鱼自动生成的定位XPath,在第一条URL中,可以正确定位到公司地址,而在第二条URL中,不能正确定位到公司地址。


7


步骤6 :可以在火狐浏览器中进行验证。这里可以把八爪鱼生成的XPath复制到火狐浏览器中去看,可以看到在第一个URL中匹配是对的,但是在第二个网页中匹配就是错误的:匹配的不是“公司地址”,而是“主营产品”字段。


8


这时就说明是XPath出了问题。我们需要修改XPath。在火狐浏览中,可以通过点击FirePath工具中“查看页面中的元素”按钮→选择网页中要提取的字段→可以看到FirePath工具中显示出了XPath路径。我们以这种方法,查看第二个URL中“公司地址”的定位XPath。


9


我们将在火狐中生成的第二个URL中“公司地址”的定位XPath,复制到第一个URL的相应位置,看看能不能匹配到“公司地址”这个字段,可以看到是匹配失败的。

 

这时候就需要我们手动写一条XPath,这条XPath需要在两个URL中,都能正确匹配到“公司地址”字段。对比两个URL中“公司地址”对应的源码,发现一个相同的特征:源码中都有“公司地址:”这几个字。

 

图3


 

 

通过这个共同特征,我们可以手动写一条XPath://li[text()='公司地址:']。
写出这条XPath,需要了解一些XPath语法:
在XPath中,匹配文本的函数是text()
//代表将HTML里面所有的节点作为选择对象
//li代表匹配所有li标签,注意后面的[]里面的条件是对所选择对象特征的进一步限制
整个 //li[text()='公司地址:'] 的意思就是:选择文本为“公司地址:”的所有li节点。由于这个网页就只有一个,所以就匹配了这一个节点。

 

图4


将这条写好的XPath,复制到八爪鱼中的相应位置。可以看到,数据就正常的跑出来了,而且是需要的公司地址数据。


10

 

小贴士:

此XPath也可以这样写 //li[contains(text(),"公司地址")],contains()表示包含。其意思为:选择文本包含“公司地址”的所有li节点。相对于 //li[text()='公司地址:'] 会更加灵活一些,//li[text()='公司地址:']就定死了,文本内容必须是“公司地址:”,多一点少一点都不行。但//li[contains(text(),"公司地址")]除了可以匹配到“公司地址:”,还可以匹配到“本公司地址”,“公司地址是”等等。即只要包含“公司地址”这几个连续的字的都可以匹配到。contains()函数的使用非常广泛,希望大家能掌握。


//*[contains(text(),"XXX")] 该XPath可以通过将XXX替换为其他文本,来匹配网页中想要定位到的任何连续文本。

 

本文仅以提取数据步骤,演示在八爪鱼中如何查看、修改XPath。实际上涉及到XPath修改的步骤还有很多,请大家灵活处理。