Racket中的一些xexpress不能通过xexpr?

时间:2016-03-08 22:51:01

标签: racket stack-overflow

谁能告诉我这里发生了什么?

#lang racket

(require (planet neil/html-parsing:2:0)
         net/url xml/path xml)

(define page "http://stackoverflow.com/questions/18902934/compile-and-run-eclipse-project-from-command-prompt")
(define port (get-pure-port (string->url page) ))
(define xexp (html->xexp port))

(displayln xexp)

(xexpr? xexp)

(define title (se-path* '(title) xexp))

(displayln title)

它将html页面拉下来,似乎将其转换为xexpr。从某种意义上说,html-> xexp并没有失败。结果看起来像是我期待的。

(xexpr? xexp)返回#f并尝试在其上调用se-path *失败,

 se-path*: contract violation
 expected: xexpr?
 given: '(*TOP* (*DECL* DOCTYPE html) "\n" (html (@ (itemscope) (itemtype "http://schema.org/QAPage")) "\n" (head "\n" "\n" (title "java - Compile and run Eclipse Project from command prompt - Stack Overflow") "\n" "    " (link (@ (rel "shortcut icon") (h...
 in: the 2nd argument of
      (-> se-path? xexpr? any/c)
 contract from: <collects>/xml/path.rkt
 blaming: anonymous-module
 at: <collects>/xml/path.rkt:74.2

因此可能(html-&gt; xexp端口)产生无效的xexpr。

我该如何调试?就像我说的那样,它是xexpr的一大块,但看起来确定。在其他页面上,代码可以像我期望的那样工作。它肯定是关于stackoverflow页面的东西。但我无法弄清楚是什么。如果我得到一块几乎OK的xexpr,我该怎么做呢?我可以清理它以便像se-path *那样工作吗?

1 个答案:

答案 0 :(得分:1)

啊......这似乎解释了

http://www.neilvandyke.org/racket/sxml-intro/

sxml / xexp与xexpr

不同

但这似乎是一种常见的混淆,所以我会在这里留下这个问题,万一其他人遇到类似的问题。