1

我正在从球拍中的 HTML 页面中提取信息。

为此,我使用了html-parsingsxml包。

我想在页面中选择具有特定 id 的元素。我目前使用纯 XPath 表达式来执行此操作:

(require sxml)

(define expression
  '(test (div (@ (id "foo") 
                 (other-attr "bar"))
              first-div-content) 
         (div (@ (id "baz") 
                 (other-attr "quux"))
              second-div-content)))

(define wanted-result
  '((div (@ (id "foo") (other-attr "bar"))
         first-div-content)))

(equal? ((sxpath "//div[@id='foo']") expression)
        wanted-result)

; ==> #t

但是,正如文档所述:

txpath 函数接受标准的 XPath 语法,而 sxpath 函数以更惯用的(用于 Racket)方式构建。

所以,我想表达与 s 表达式相同的路径。虽然从给出的示例中很容易"//div"变成'(// div),但我没有找到如何查询特定属性。我收集到我必须使用sxml-converteror sxml-converter-as-predicate,但不知道该怎么做。

我知道 xpath 版本工作得很好,也许我不应该费心使用 s-expressions,但我想了解它是如何工作的,然后自己决定使用哪个版本。

4

1 回答 1

1

我认为特定的 xpath 写成

(sxpath '(// (div (@ id (equal? "foo"))))))

sxpath 元素(div (@ id (equal? "foo")))的形式为(sxpath-or-symbol reducer-path ...),这意味着选择匹配的元素sxpath-or-symbol,并且每个 元素都具有非空匹配项reducer-path。文档中的重写规则sxpath旨在传达这个想法,但他们可以使用更多示例。

属性通常被视为@节点的子元素。

于 2016-11-09T18:15:18.190 回答