Racket的SXpath:从XPath字符串到“惯用方式”

时间:2016-11-09 14:13:43

标签: xpath scheme racket sxml

我正在努力从球拍中的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-convertersxml-converter-as-predicate,但不知道该怎么做。

我知道xpath版本运行得很好,也许我不应该使用s表达式,但我想了解它是如何工作的,然后自己决定使用什么版本。

1 个答案:

答案 0 :(得分:1)

我认为特定的xpath写为

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

sxpath元素(div (@ id (equal? "foo")))的格式为(sxpath-or-symbol reducer-path ...),这意味着选择与sxpath-or-symbol匹配的元素,每个reducer-path也有非空匹配。 sxpath文档中的重写规则旨在表达这一观点,但他们可以使用更多示例。

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