解析指令示例
查看自定义解析器的解析指令实用示例:处理嵌套对象、列表、错误和数组的数组。
以下 HTML 片段将使用接下来的章节中的示例解析说明进行解析。
示例 HTML
<body>
<div id="products">
<div class="product" id="shoes">
<div class="title">Shoes</div>
<div class="price">223.12</div>
<div class="description">
<ul>
<li class="description-item">Super</li>
</ul>
</div>
</div>
<div class="product" id="pants">
<div class="title">Pants</div>
<div class="price">60.12</div>
<div class="description">
<ul>
<li class="description-item">Amazing</li>
<li class="description-item">Quality</li>
</ul>
</div>
</div>
<div class="product" id="socks">
<div class="title">Socks</div>
<div class="price">123.12</div>
<div class="description">
<ul>
<li class="description-item">Very</li>
<li class="description-item">Nice</li>
<li class="description-item">Socks</li>
</ul>
</div>
</div>
</div>
</body>最基本要求
示例 1。使用 XPath 选择 Shoes 描述项。
该 xpath 函数会找到单个项并将其作为字符串放入列表:
确切的 xpath 函数行为在此描述 此处.
嵌套解析说明
你正在定位示例 HTML 的这一部分:
并且你希望解析结果具有以下结构:
解析说明如下所示。
示例 2。使用解析说明解析 shoes 信息。
xpath_one 的工作方式类似于 xpath,但不是返回所有匹配项的列表,而是 返回第一个匹配的项.
在上面的示例中, shoes 属性是最外层说明作用域中定义的唯一属性。该 shoes 属性包含嵌套解析说明。
该 shoes 说明作用域没有定义管道(_fns 属性不存在)。这意味着在 title, 价格,和 description 作用域中定义的管道将使用被解析的文档作为管道输入。
在示例 2 中,你可以看到在 XPath 表达式中重复出现了 //div[@id='shoes'] 重复可以通过在 shoes 作用域中定义管道来避免:
示例 3。在 shoes 作用域说明中定义管道以避免 XPath 表达式重复。
通过使用示例 3 中提供的解析说明,Custom Parser 将:
从处理开始
shoes._fns管道,该管道将输出shoesHTML 元素;将
shoes._fns管道输出并将其用作在title,价格,和description作用域中定义的管道的输入;处理
title,价格,和description管道以生成最终值。
结果将看起来与示例 2 的结果相同:
示例 2 与示例 3 的主要区别在于在示例 3 中,管道在 shoes 作用域中定义。 这个额外的管道选择了 shoes 的元素并将其传递给说明层级中更深处的管道。
嵌套对象列表
该 示例 HTML 再次将用作被解析的文档。
如果你希望解析结果如下所示:
解析说明如下所示:
示例 4。解析 HTML 文档中找到的所有产品。
解析说明结构类似于示例 3。不过,有两个主要例外:
xpath用于代替xpath_oneinproducts._fns管道。products._fns该管道现在将输出一个匹配所提供 XPath 表达式的所有元素的列表(一个产品元素列表)。_items保留属性用于指示你希望通过遍历products._fns管道输出的每一项来形成一个列表并 单独地传递/处理每个列表项 沿着管道作用域下游。
如果 _items 保留属性在示例 4 的解析说明中未使用,解析结果将如下所示:
_items 用于指定 Custom Parser 必须传递 单独的列表项 而不是 整个列表 沿着解析说明传递。
从列表中选择第 N 个元素
本节演示管道的灵活性。同一问题可以用不同方法解决。
可以使用多种选项从任意值的列表中选择第 N 个元素。
该 示例 HTML 再次使用作为示例。你有多种选择来选择第 2 个产品。
选项 1
你可以利用 XPath [] 选择器并在 XPath 表达式中定义选择。
示例 5。使用 XPath [] 选择器选择第 2 个价格。
结果:
选项 2
你也可以使用 xpath 函数查找所有价格并将其管道到函数 select_nth,该函数从提取的价格列表中选择第 n 个元素。
示例 6。使用 `select_nth` 函数选择第 2 个值。
结果:
注意到 select_nth 函数从列表中返回一个项,而 xpath 函数返回一个项的列表,即使只找到单个项也是如此。
选项 3
您可以使用 select_nth 适用于任何列表类型,包括 HTML 元素列表:
示例 7。使用选择所有带有 class="product" 的产品 HTML 元素 ==> 从列表中选择第 2 个产品元素 ==> 从所选产品 HTML 元素中提取价格文本.
结果:
错误处理
当给出以下 HTML 片段时:
并尝试使用以下解析说明进行解析:
Custom Parser 将返回一个解析结果,其中 价格 和 title 被正常解析,但 description 解析失败,原因是 convert_to_float 函数未能将其转换 字符串 to float:
默认情况下,所有错误都被记为警告并放在 _warnings 列表中。如果你希望在解析字段时忽略错误,可以使用 "_on_error": "suppress" 参数来抑制警告/错误:
这将产生如下结果:
数组的数组
Custom Parser 允许在解析结果中使用 N 维数组。作为示例,使用以下 HTML 片段:
假设你希望将文档解析为一个 3x3 的二维整数数组:
要将 HTML 解析为上述 JSON,你可以使用以下解析说明:
最后更新于
这有帮助吗?

