智能标签采集器(优采云基础操作和XPath相关知识教程-XPath系统学习 )

优采云 发布时间: 2021-09-14 22:11

  智能标签采集器(优采云基础操作和XPath相关知识教程-XPath系统学习

)

  在学习本教程之前,您需要具备优采云基本操作和XPath相关知识。如果您还没有掌握,请先学习以下课程。

  自定义模式入门:

  XPath 系统学习和示例:

  一、relative XPath

  Relative Xpath,即相对于loop box的Xpath,有两个典型特征:跟随loop链接;与循环框的XPath合并,形成一个完整的定位XPath。

  常见的应用场景有两种:在循环内部提取数据;在循环外提取数据。

  下面会详细说明。

  二、使用相对XPath提取循环中的数据

  示例网址:

  要求:采集此URL列表的项目名称、省份、来源平台、业务类型、时间等字段

  

  Step1:按照之前学过的列表采集的方法创建循环框。或者使用自动识别自动创建循环框。

  这里使用了自动识别。可以看到优采云自动创建循环并提取列表数据。

  

  Step2:优采云自动创建的循环列表会自动为我们生成循环框的XPath和相对XPath。一起来看看:

  循环框的XPath

  循环框的XPath为://div[@class="publicont"]。通过这个XPath,找到20个列表项,对应页面上的20个数据列表。

  

  相对 XPath

  在每个周期项目中,都有项目名称、省份、来源平台、业务类型和时间等字段。查看每个字段的定位XPath,路径见下图。

  如您所见,每个字段都使用相对 XPath。以 item title 和 time 两个字段为例。

  [item title]字段的相对XPath:/DIV[1]/H4[1]/A[1]

  [时间] 字段的相对 XPath:/descendant-or-self::SPAN[@class="span_o"]

  

  循环框的XPath与相对XPath的关系

  循环框的XPath:定位列表项。

  Relative XPath:字段相对于循环框(列表项)的位置。

  循环框的XPath + 相对XPath = 每个循环项中字段的XPath

  

  正是因为相对XPath的存在,我们才能够实现循环与字段的联动采集:

  循环框中当前项目为list 1-定位list 1中的字段(项目名称、省份、来源平台、业务类型、时间)

  将循环框的当前项切换到列表2-定位列表2中的字段

  将循环框的当前项切换到列表3-定位列表3中的字段

  将循环框的当前项切换到列表4-定位列表4中的字段

  ......

  最后1个列表-最后1个列表中的采集Fields

  

  如果没有相对 XPath 怎么办?

  无法实现循环项与字段联动的效果,只能固定第一个循环项中的字段采集。

  根据需求修改相对XPath

  通过上面的学习,我们已经知道了相对XPath的原理。在大多数情况下,优采云 会自动为我们生成一个相对 XPath,并正确提取循环项中的字段。目前不需要修改。在少数情况下,自动生成的相对XPath无法适应所有网页,部分字段无法提取,或者字段错位。这种情况需要我们自己修改。

  看下面的例子。

  修改相对 XPath 实例

  网站上面,[time]字段的相对XPath为:/descendant-or-self::SPAN[@class="span_o"],比较长,难懂。我们可以写一个简短的,易于理解的。如何修改?

  第一步:将循环框的XPath//div[@class="publicont"]复制到火狐浏览器。

  

  Step2:然后找到[time]字段对应的网页源码。可以看到是一个带有class属性的span标签,属性值为pan_o。根据这个特性,可以写一个定位XPath: //div[@class="publicont"]//span[@class="span_o"] .

  如您所见,网页上的所有[时间]字段都被虚线框包围,表明它们已被定位。

  

  Step3:根据前面学到的知识,循环框的XPath为//div[@class="publicont"],[time]字段的相对XPath为://span[@class= "span_o"] .

  将//span[@class="span_o"]复制粘贴到优采云中[time]字段的相对XPath输入框中。然后点击【应用】保存。

  

  这样我们就完成了[time]字段的相对Xpath重写。启动[local采集],查看采集的结果,循环项中的数据全部降为正常采集。

  

  三、使用相对XPath提取循环外数据

  示例网址:

  要求:采集城市及其对应省份的完整列表。

  Step1:按照list data采集的方法,选择所有[Cities]创建一个循环。

  同时,我们也想下载每个城市对应的省份采集。所以选择第一个省,在操作提示框中选择【采集元素的文本】。

  手动执行规则,我们发现2个问题:

  ①不分城市,采集下的省份是【安徽】。如果选择福州,将提取安徽省而不是福建省。

  ② 4个直辖市没有采集down。

  

  Step2:我们先解决4个不在直辖市的城市的问题。

  将循环列表的XPath //HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI[position()>1]/A复制到Firefox浏览器。可以看到,除了第一排的4个直辖市,其他城市都在。

  在XPath课程中,我们讲了位置函数,它可以限制可以定位的列表的数量。这里 [position()>1] 将过滤掉第一个 li 列表(4 个直辖市的列表)。我们要定位4个直辖市,去掉[position()>1]: //HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A .

  

  然后在优采云中相应地修改循环框。修改后可以看到循环列表第一行收录4个直辖市,如下图。

  

  Step3:解决总是针对[安徽]省的问题。

  提取[省]时,优采云自动生成的XPath位置为//DIV[@class="outCont"]/UL[1]/LI[2]/STRONG[1]。将此XPath复制到火狐浏览器,可以看到只能固定提取【安徽】,无法链接到循环列表中的城市。因此,当提取的城市发生变化时,省份不会随着城市的变化而变化。

  

  我们观察省市对应的源码。发现省都是强标签,城市都是a标签。直辖市标记为b,直辖市的4个城市标记为a。

  strong 标签和 b 标签与 a 标签处于同一级别,并且都在 a 标签之前。

  

  回想一下,我们基于城市构建了一个循环列表,即 a 标签。如果需要省市一一对应(包括直辖市和具体城市一一对应),就需要用到上面学到的相关XPath知识。在这个例子中:

  循环框的XPath:定位列表项(所有城市)

  Relative XPath:字段相对于圆形框的位置(省相对城市的位置)

  循环框的XPath + 相对XPath = 每个循环项外的字段的XPath(省的位置XPath)

  根据源码特性,根据城市列表写出XPath到省(包括直辖市)的位置。城市列表定位XPath为/HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A。定位a标签前的同级元素,需要使用previous-sibling函数,在XPath教程中有详细介绍。因此:

  (1) [省] XPath 相对于 [城市]:

  /HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A/preceding-sibling::strong[1]

  (2)[直辖市]XPath相对于[市]:

  /HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A/preceding-sibling::b[1]

  我们可以进一步将这两项合并为一项,合并后的结果为:

  /HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A/preceding-sibling::*[last()]

  * 表示任意标签,即strong标签或b标签可以用*替换

  last() 表示最后位置的标签。

  XPath 的整个解释是取城市列表(a 标签)之前的最后一个兄弟标签(强标签或 b 标签),适用于两种情况。

  根据上面的知识,/HTML/BODY[1]/DIV[4]/DIV[4]/UL[1]/LI/A就是循环框的XPath,/preceding-sibling:: *[last( )] 是相对 XPath。

  在Firefox中验证,所有省份(包括直辖市)都位于。

  

  最后在优采云中做相应的修改。

  点击字段[省份],选择[自定义定位元素方法],勾选[相对于当前循环中的Xpath],输入我们写的相对XPath:/preceding-sibling::*[last() ] ,最后点击【应用】保存。

  

  手动执行规则,将循环列表分别切换到省市,检查验证是否已链接,并正确提取相应数据。

  直辖市-上海,直辖市-天津:

  

  福建省-福建省泉州-厦门:

  

  启动[local采集],看采集的结果,可以看到省(包括直辖市)和城市是一一对应的。

  

  特别注意:

  当你想在XPath采集循环之外使用数据时,需要特别注意。它只适用于提取循环外的单个数据(只有一个数据)。不适合循环外还有一个列表,有多行数据的情况。

  例一:循环外的单个数据,适用

  日期和星期是一个单一的数据写在一起,使用所有的事件,即li标签作为一个循环,然后在循环外提取li标签前面的h6标签,以及循环外的时间标签下一层。

  

  例2:循环外也是一个列表,多个数据,不适用

  上下有两张表。下表中的数据与上表中的数据一一对应。上下表和对应关系采集放不下是不可能的。因为上表采集需要创建循环,而下表采集也需要创建循环,会有两个循环,但是没有办法在循环和循环之间产生联动效果, 优采云暂不支持流通与流通联动。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线