捕获和转换Web的工具

完善抓取的数据

尽管其他许多文章都涉及如何提取数据,但本文还是解释了如何精炼提取的数据,从而仅保留所需的信息。 为此特别 Criteria 在以下所有示例中,使用的方法时,都是从HTML表中提取数据,只要每个数据内容div,span,image等的长度相同,就可以从各种不同的源中提取该数据。

表格示例:图书清单

以下是此示例在此表中要抓取的表数据,由四列组成 标题, 作者, 书龄状态.

标题 作者 书龄 状态
如何园艺 John 5 发布时间
如何使用相机 莎拉 0 不完整
如何使用相机 莎拉 0 不完整
天文学变得容易 多米尼克 1 正在审查中
如何熨烫 保罗 1 正在审查中
如何绘制 Mike 3 发布时间
如何使用电脑 雷切尔 4 发布时间
var titles = Page.getTagValues({"position":1,"tag":{"equals":"td"},"parent":{"tag":{"equals":"tr"}}});
var authors = Page.getTagValues({"position":2,"tag":{"equals":"td"},"parent":{"tag":{"equals":"tr"}}});
var ages = Page.getTagValues({"position":3,"tag":{"equals":"td"},"parent":{"tag":{"equals":"tr"}}});
var statuses = Page.getTagValues({"position":4,"tag":{"equals":"td"},"parent":{"tag":{"equals":"tr"}}});

通常,需要精简抓取的数据,以便仅获得所需的信息。 这是 Criteria 使用功能。 例如,如果仅需要已出版的书籍,则需要将上面的“状态”列限制为已发布,然后将这些更改应用于其他列数据,如下所示。

Criteria.create();
statuses = Criteria.equals(statuses, "Published");
titles = Criteria.apply(titles);
authors = Criteria.apply(authors);
ages = Criteria.apply(ages);

使用时 Criteria 减少数据的所有更改的方法必须一次应用于一列 apply 该方法用于必须删除相应记录的任何其他列。 一旦完成 Criteria.create() 必须在为其他列设置条件之前调用方法。 正是由于这个原因,最佳做法是将 Criteria.create() 在其他任何标准方法之前。

在示例中,状态列被限制为仅包含 发布时间,然后使用 Criteria.apply 方法还删除了其他三列中的相应记录,以使所有列保持一致。 请记住,apply方法仅在不同的列包含相同数量的记录时才有用。

Critieria也可以组合在一起以多种方式限制数据。 以下示例通过使用,将“图书年龄”列限制为超过一岁但少于五年的图书。 Criteria.lessThan()Criteria.greaterThan() 方法。

Criteria.create();
ages = Criteria.greaterThan(ages, 1);
ages = Criteria.lessThan(ages, 5);
titles = Criteria.apply(titles);
authors = Criteria.apply(authors);
statuses = Criteria.apply(statuses);

有时有重复的数据需要删除,要删除此信息,您可以使用 Criteria.unique 方法。

Criteria.create();
titles = Criteria.unique(titles);
authors = Criteria.apply(authors);
ages = Criteria.apply(ages);
statuses = Criteria.apply(statuses);

现在,将删除基于标题列的所有重复行。 下一个方法是 Criteria.remove 方法。 如果在array参数中找到了这些列值,则这将从列中删除项目。

var authorsToRemove = ["Mike","Rachel"];
Criteria.create();
authors = Criteria.remove(authors, authorsToRemove);
titles = Criteria.apply(titles);
ages = Criteria.apply(ages);
statuses = Criteria.apply(statuses);

在这里,删除了authors列中所有等于Mike和Rachel的记录,然后应用apply方法,然后从其他列中删除相应的记录。