Selection Techniques
选择技术是web抓取最重要的方面之一。当您点击web浏览器中的内容来创建内容和模板时,您将使用最基本的选择技术,这是简单的point and click。除了简单的point and click功能外,Visual Web Ripper还提供了一系列工具来帮助你做出完美的选择。这些工具包括:
- 允许您操作选择XPath的XPath编辑器
- 树形视图浏览器提供了一个不同的,更精确的网页视图
- 列表选项,帮助您创建选择元素列表的选项
- 帮助您将条件应用到选择XPath的过滤器
很重要的一点是,当您在Web浏览器中选择HTML元素时,Visual Web Ripper无法读懂您的思路。新手用户常常会在一些情况下感到困惑,比如当他们有一个搜索结果时,每个条目都有一个标题。有时标题是链接,有时是纯文本,所以标题的HTML可能是这样的:
<h1><a href="http://website.com">Heading as a link</a></h1>
<h1><span>Heading as plain text</span></h1>
如果您想要提取所有标题的文本,您可以选择第一个标题,并通过重复选择创建一个列表模板。如果第一个标题是链接,那么这样的选择只会选择链接的标题,而不是纯文本的标题。Visual Web Ripper 不知道你想要提取所有的标题,但是认为你在尝试选择链接。在本例中,您需要更改选择,以便在创建列表之前选择“标记”而不是链接标记。
选择XPath
每次单击web浏览器中的内容时,Visual Web Ripper 就会在幕后进行一些高级处理,以计算选择XPath。XPath是一种常用的语法,用于在类似于xml的文档中选择元素,比如HTML文档。Visual Web Ripper 使用了XPath的定制实现,它支持XPath v1.0语法。定制的Visual Web Ripper XPath版本还支持一系列特别设计的新方法来简化Web抓取。
选择XPath可以选择一个或多个HTML元素。通常,创建list模板使用一个选择多个元素的XPath。
Visual Web Ripper 有一系列工具可以帮助您创建一个完美的XPath,而不需要了解XPath语法。但是,在某些情况下,您可能需要手动调整XPath,因此,如果您想成为一个专业的web采集机,您必须知道XPath语法。
每次在web浏览器中进行选择时,您都可以在Options选项卡中查看选择XPath。
上面的图像中的XPath包含以下两个步骤:
- 使用ID属性值listView选择页面上的所有DIV标签
- 然后选择带有class属性值hproduct的所有子DIV标签
Visual Web Ripper 支持自定义XPath函数。请参阅自定义XPath函数获得更多信息。
Visual Web Ripper 支持以下非标准XPath方法、属性和axis。
非标准的XPath方法 | Non-standard XPath Methods |
---|---|
Position | 这是标准位置方法的一个扩展。 Position() - 类似于标准 Postion XPath方法。Position(StartIndex) - 选择除第一个 StartIndex 节点之外的所有节点。Position(StartIndex, EndIndex) - 选择 StartIndex 和EndIndex 之间的所有节点。Position(StartIndex, EndIndex, SkipLastIndex) - 选择 StartIndex 和EndIndex-SkipLastIndex 之间的所有节点。如果EndIndex 为0,那么简单地跳过最后一个SkipLastIndex 节点。Example: //table/tr/[position(2,0,1)]
|
Count | 返回给定XPath的节点数量。Count(XPath) Example: //table/tr/[count(td)=2]
|
Span | 在选择中包含许多兄弟节点。 Span(Count) -在选择中包括计数Count的兄弟节点。 Span(UntilElementXPath) - 包括所有的兄弟节点,直到遇到 UntilElementXPath 指定的元素为止。Example: //div/p[span('hr')]
|
非标准XPath属性 | Non-standard XPath Attributes |
node-position | 返回当前节点在其父节点中的位置。 |
root-node-position | 返回其父节点中的根节点的位置。这只适用于PageArea模板选择,因为一个PageArea的根节点不是文档的根节点。如果PageArea tempate是一个列表模板,那么根节点就是当前的PageArea列表元素的节点。 |
tag-text | 返回当前节点的文本,不包括任何子节点的文本。 |
非标准XPath Axis | Non-standard XPath Axis |
Root | 一个PageArea模板选择的根节点。如果PageArea tempate是一个列表模板,那么根节点就是当前的PageArea列表元素的节点。 |
优化选择XPath / Optimizing the Selection XPath
如果目标页面的变化稍微有些变化,那么长的XPath不太可能很好地工作。XPath中的每一步都必须匹配页面上的HTML标记。如果这些标记中的任何一个被删除或移到网页的其他地方,XPath将会失败。
当您在web浏览器中单击HTML元素时,Visual Web Ripper会自动尝试创建一个优化的选择XPath。它通过使XPath尽可能短而做到这一点。例如,对DIV HTML元素的完整选择XPath路径如下:
DIV[1]/DIV[5]/TABLE[2]/TBODY[1]/TR[2]/TD[1]/DIV
如果DIV标签有一个惟一的ID值listView,那么优化的XPath就是:
//DIV[@id='listView']
Visual Web Ripper 将会在网页上寻找一个具有ID属性值listView的DIV标签。XPath非常健壮,对未来的页面更改不敏感。只要这个元素存在于网页上,XPath就可以工作,即使网页的其他部分也会改变。
Visual Web Ripper 喜欢使用ID属性来优化xpath,因为IDs在web页面上应该是惟一的。然而,有时网站使用的ID是特定的内容元素,例如产品ID,而这些ID不适合在XPath中使用。如果从产品目录中提取数据,通过使用XPath从所有产品细节页面中提取产品标题,您不希望XPath依赖于特定的产品ID,比如这个XPath:
//H1[@id='sku_245865']
这样的XPath只适用于一种特定的产品,而不适用于其他产品。在这种情况下,您需要使用没有IDs的XPath选项。您可以使用其他一些XPath选项来调整选择。
Xpath 选项 | XPath Options |
---|---|
Optimize XPath | 自动尝试优化选择XPath,使之尽可能短。这使得XPath更加健壮,对未来的页面更改也不那么敏感。 |
Optimize without IDs | 选择这个选项,告诉Visual Web Ripper 不要在xpath中使用id。Visual Web Ripper 喜欢使用ID属性来优化xpath,因为ID在网页上应该是唯一的。有些网站可能使用不适合XPath的id,因为它们与网页上的特定内容有关,比如产品id,或者因为它们是根据日期和时间生成的。 |
Accuracy | 这个选项指定XPath中需要多少步骤。 一个四步XPath可以是这样的: //TABLE/TBODY/TR/TD 一个两步的XPath可以是这样的: //TR/TD
|
Attributes | 该选项指定在XPath的第一步中应该使用哪些属性。 具有属性类的XPath可以是这样的: //TABLE[@class='table1']/TBODY/TR/TD 将查找带有指定属性的第一个标记,该属性至少可以通过精度选项指定的步骤数量来生成XPath。例如,如果将属性设置为类,并且精度设置为2,那么XPath仍然可以像下面的XPath一样,如果标记TBODY、TR和YD没有一个类属性: //TABLE[@class='table1']/TBODY/TR/TD
|
Row span | 在PageArea模板中使用行span,在选择中包含指定的兄弟HTML元素数量。 例如,您可能想要选择标题元素和以下两段的第一个段落: <h1>header text<h1><p>paragraph1</p><p>paragraph2</p><p>paragraph3</p><p>paragraph4</p> 在本例中,您可以选择header元素,并将行span选项设置为3。当在List模板中使用Row span时,它将应用到列表中的所有项,但是一个列表项的兄弟元素将不会与下一个列表项重叠。 |
创建列表Creating Lists
在许多情况下,您将希望从列表中提取数据,例如表或搜索结果。Visual Web Ripper有几个工具可以帮助你创建一个列表选择。
尝试使用不同的工具来确定给定场景的最佳技术。首先,最好先尝试创建列表上下文菜单工具。如果这不起作用,试试不同的列表选项。
创建列表上下文菜单 The Create List Context Menu
创建一个在大多数场景中起作用的列表的最简单方法是使用create list上下文菜单,遵循以下两个简单步骤:
- 在web浏览器中选择列表中的第一个元素。这个选择必须准确地选择第一个元素。例如,如果您正在创建一个选择表中的所有行的列表,那么该选择应该选择一个完整的表行。
- 右键单击列表中的另一个元素,并从上下文菜单中选择Create list。
以下两步的过程如下图所示:
步骤1 - 在web浏览器中选择列表中的第一个元素
步骤2 - 右键单击列表中的另一个元素
Visual Web Ripper 使用列表中的两个元素的信息来创建完整的列表。如果列表中的行看起来不同,比如上面的图像中的交错行,那么选择一种类型的行并右键单击另一种类型的行是很重要的,这样Visual Web Ripper 就可以使用来自这两种类型的信息来创建完整的列表。如果在选择中没有包含某些类型的行,或者如果您想从选择中删除某些类型的行,可以使用上下文菜单保存在列表中,并从列表中删除。
列表选项 List Options
列表选项可用于重复选择,以便创建列表选择。要使用列表选项,您必须首先在web浏览器中选择一个HTML元素,然后选择其中一个列表选项。
自由重复(Free repeat)选项从选择XPath中删除位置信息,从而选择一个与所选元素相似位置的页面上的所有元素。这个选项通常会选择太多的元素,但是您可以使用扩展/限制(Expand/Limit)选择工具栏按钮来包含或者从列表选择中排除元素。
流重复(Flow repeat)选项在其父容器中重复选择。当您想要选择一个HTML列表中的所有元素,或者您想要选择单个表行中的所有列时,这个选项就可以很好地工作。
父流重复(Parent flow repeat)选项被设计用于为表中的所有行选择单个列。
手动(Manual)选项不修改选择XPath。如果您想手动输入选择XPath,请使用此选项。如果您输入的是选择多个元素的XPath,但是您没有选择手动列表选项,那么Visual Web Ripper 将不会把您的选择识别为一个列表选择,并且只处理列表中的第一个元素。
可以使用Start索引和Count选项来排除列表中的某些元素。Start index选项指定包含在列表中的第一个元素的索引。Count选项指定要包含在列表中的选项的数量。
Advanced Options选项卡包含列表选项跳过最后一行计数,它指定从列表末尾删除的固定数量的元素。
使用过滤器 Using Filters
选择筛选器用于限制选择,因此只有在满足特定条件时才选择元素。选择过滤器通常用于以下两种情况:
- 当您想要将一个列表选择限制为包含特定子元素的元素时
- 当您想从属性表中选择一个值时,一个特定的名称/值对位于不同的web页面的不同位置
使用筛选器来限制列表的选择 Using a Filter to Limit a List Selection
下图显示了一个列表选择,其中所有的行都被选中。标题行是表中的一个普通行,因此这个行包含在列表中。如果您想从这个表中提取数据,您通常不会对标题行感兴趣,因为它不包含任何数据。然而,有时很难将行排除在列表选择之外。
请注意,上面的表中所有的行都有一个详细的链接元素。您可以使用此信息来过滤列表,因此只有包含该链接的行才包含在列表中。您可以通过右键单击链接元素,并从上下文菜单中选择必须包含这个元素过滤器。
现在,标题行已经从下面的列表选择中删除了。
使用筛选器来选择不同位置的内容
模板定义了如何从一种类型的网页中提取数据,例如产品目录中的产品细节页面。有时,内容位于同一类型网页的不同位置。例如,您可能有一个产品细节页面,它显示了产品属性列表,例如下面的屏幕截图。不同的产品可能有不同的产品特性。例如,在下图中,产品属性产品宽度可能位于表的不同位置。
Visual Web Ripper 在特定位置寻找内容,因此对于一种产品,它可以提取产品宽度,但对于另一种产品,它可以提取产品重量。
文本过滤器可以处理不同位置的内容。网页上的大多数数据属性都有一个相关的文本组件来描述数据属性。在下面的网页上,文本域产品宽度描述了产品宽度的数据属性,因此你可以告诉Visual Web Ripper 在表格中寻找文本“产品宽度”,然后选择相关的数据属性。
要使用文本过滤器,选择您想要提取的数据属性,右键单击相关联的文本元素,然后选择Must Have Text...过滤