我正在努力从球拍中的HTML页面中提取信息。
为此,我使用html-parsing和sxml个包。
我想在页面中选择一个具有特定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-converter
或sxml-converter-as-predicate
,但不知道该怎么做。
我知道xpath版本运行得很好,也许我不应该使用s表达式,但我想了解它是如何工作的,然后自己决定使用什么版本。
答案 0 :(得分:1)
我认为特定的xpath写为
(sxpath '(// (div (@ id (equal? "foo"))))))
sxpath元素(div (@ id (equal? "foo")))
的格式为(sxpath-or-symbol reducer-path ...)
,这意味着选择与sxpath-or-symbol
匹配的元素,每个reducer-path
也有非空匹配。 sxpath
文档中的重写规则旨在表达这一观点,但他们可以使用更多示例。
通常将属性视为@
节点的子元素。