1

ラケットの 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-converterorを使用する必要があるsxml-converter-as-predicateと思いますが、その方法がわかりません。

xpath バージョンが非常にうまく機能することはわかっているので、わざわざ s 式を使用するべきではないかもしれませんが、それがどのように機能するかを理解し、使用するバージョンを自分で決定したいと考えています。

4

1 に答える 1

1

特定のxpathは次のように書かれていると思います

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

sxpath 要素(div (@ id (equal? "foo")))の形式は です。これは、各 に対して空でない一致も持つ(sxpath-or-symbol reducer-path ...)一致する要素を選択することを意味します。のドキュメントの書き換え規則は、この考えを伝えることを目的としていますが、より多くの例を使用できます。sxpath-or-symbolreducer-pathsxpath

@属性は通常、ノードの子要素であるかのように扱われます。

于 2016-11-09T18:15:18.190 に答える