Last updated
Was this helpful?
Last updated
Was this helpful?
如需使用自定义解析器,请在创建作业时提供一组parsing_instructions
。
比如,您想解析在Bing搜索中搜索测试
所得出总结果的数量:
一个作业参数的示例如下:
第1步. 您必须提供"parse": true
参数。
第2步. 解析指令应在"parsing_instructions"
字段中进行描述。
上述解析说明样本指定的目的是解析抓取文档中的搜索结果数量,并将结果放在number_of_results
字段中。关于如何通过定义“pipeline”来解析字段的指令如下:
管线是指一个要执行的数据处理函数的列表。这些函数将按照它们在列表中出现的顺序执行,并将前一个函数的输出作为输入。
上述样本作业的解析结果应如下所示:
自定义解析器不仅提供了从抓取的HTML中提取文本的功能,而且还可以执行基本的数据处理功能。
例如,前文中描述的解析指令在提取number_of_results
为文本的同时会带有您可能不需要的额外关键词。如果您想得到数字数据类型的指定query=test
结果数量,则您可以重复使用相同的解析指令,并在现有的管线中添加amount_from_string
函数:
上述样本作业的解析结果应如下所示:
我们可以看到,它已准确地解析了该文件:
在编写HTML元素选择函数时,要确保使用抓取的文件,而不是浏览器上加载的实时网站版本,因为这些文件可能有所不同。这个问题背后的主要原因在于JavaScript的渲染。当一个网站被打开时,您的浏览器负责加载额外的文件,如CSS样式表和JavaScript脚本,它们可以改变初始HTML文件的结构。当解析抓取的HTML时,自定义解析器并不像浏览器那样加载HTML文档(解析器忽略了JavaScript指令),因此HTML树在解析器和浏览器呈现的内容可能有所不同。
如下所示,请查看下列HTML文档:
如果您通过浏览器打开文档,则它将显示出您可以使用以下XPath表达式选择的价格 //p[@id="price"]
:
现在,如果您在浏览器中禁用了JavaScript渲染,则网站将呈现如下结果:
同样的//p[@id="price"]
XPath表达式将不再匹配价格,因为其未经渲染。
由于各种原因,同一个页面被抓取两次可能会有不同的布局(抓取时使用的用户代理不同,目标网站做A/B测试等等)。
为了解决这个问题,我们建议为最初抓取的文档定义 parsing_instructions
, 并立即用相同页面类型的其他多个抓取作业结果测试这些指令。
使用爬虫API抓取目标页面的HTML文档。
禁用JavaScript,在您的浏览器上本地打开抓取的HTML。如果在打开HTML后禁用了JavaScript,请务必重新加载页面,以便在没有JavaScript的情况下重新加载HTML。
假设您有以下页面需要解析:
解析产品标题
创建一个新的JSON对象并给它分配一个新的字段。
您可以用任何喜欢的方式来命名这个字段,但有一些例外(用户定义的字段名不能以下划线_
开头,例如"_title"
)。
字段名将显示在解析的结果中。
新字段必须拥有一个JSON对象类型值:
如果您向自定义解析器提供这些指令,它不会执行任何操作,或者发送一个投诉表示您没有提供任何指令。
为了真正将标题解析到标题段中,则您必须在标题对象内部使用保留的_fns
属性(其始终为数组类型)定义一个数据处理管线:
上述的解析指令应该得出以下结果:
解析描述
同样,在解析指令中,您可以定义另一个字段,需要进行解析的产品描述容器、描述标题和项目。如果标题和项目的描述要嵌套在description
对象下,则指令的结构应该如下:
给定的解析指令结构意味着description.title
和description.items
将根据description
的元素进行解析。您可以为描述字段定义一个管线。在这种情况下,它会被优先完成,因为它将简化对标题描述的XPath表达式。
在这个示例中,description._fns
管线将选择description-container
HTML元素,并将被用作解析描述标题和项目的参考点。
为了解析其余的描述字段,须为字段description.items
和description.title
添加两个不同的管线:
请注意xpath函数的使用方法,而不是xpath_one
来提取符合XPath
表达式的所有项目。
解析指令产生的结果如下:
解析产品变体
下面的示例中显示了如果您想把信息解析到product_variants
字段中的指令结构,其将包含一个变体对象的列表。在这种情况下,其变体对象拥有价格和颜色字段。
首先选择所有的产品变体元素:
为了使product_variants
成为一个包含JSON对象的列表,您将不得不使用_items
迭代器来迭代找到变体:
最后,定义关于如何解析颜色和价格字段的说明:
有了product_variants
的描述,其最终的指令将如下:
其将产生以下输出内容:
如果自定义解析器无法处理客户定义的解析指令,我们将返回12005状态代码(解析后有警告)。
对于此类结果客户将被收取费用:
如果自定义解析器在解析操作中遇到异常并中断,则它将返回这些状态代码:12002
、12006
、12007
。您不会因为这些意外的错误而被收费。
在上面的示例管线中,使用了xpath_one
函数()。它允许您使用XPath表达式和XSLT函数来处理HTML文档。作为一个函数参数,指定可以找到目标元素的确切路径:.//span[@class='sb_count']
。您也可以指示解析器选择在目标元素中发现的text()
。
HTML选择器函数支持(xpath
/xpath_one
)。
。
对于由自定义解析器选择标题的文本,您可以利用HTML选择器函数xpath_one
。如需在HTML文档上使用该函数,则应将其添加到数据处理管线中。该函数被定义为一个JSON对象,具有必要的_fn
(函数名称)和必要的_args
(函数参数)字段。查看完整的函数定义列表。
您可以在这里找到更多解析指令的示例:。
请查看所述的状态代码。