2

所以我在类文件中有这段代码:

Document requestData (String url, [String postVars, bool pauseApp = false, onSuccess(Document ht)]) {
   HttpRequest html = new HttpRequest();
   html.open((postVars == null ? 'GET' : 'POST'), url, async: !pauseApp);

   html.send(postVars);
   if (pauseApp == true) { return html.responseXML; }
   else { html.on.readyStateChange.add((Event e) { 
             if (html.readyState == HttpRequest.DONE && (html.status == 200 || html.status == 0)) {
                 try { 
                   //HERE IS WHERE THE ISSUE IS ----V
                   DOMParser d = new DOMParser();
                   onSuccess(d.parseFromString(html.responseText,"text/html")); 
                   }
                 catch (e) {
                   print("Error on requestData($url) async = $pauseApp - $e");
                 }
               }
           });
     }
 }

(整个参考来源:http ://pastebin.com/z21PM7r0 - 我使用 dartium 标志“--disable-web-security”来允许跨服务器请求)

问题基本上是,请求 responseXML 返回 null 而 responseText 按预期返回 HTML。为了解决这个问题,我尝试使用 DOM 解析器,但失败了。

由于我不拥有或控制我需要连接的服务器,我无法自己修复 html。我假设的问题是因为它的格式不正确。

这是我尝试使用上述函数解析的网站代码:http: //pastebin.com/KvMN9AuF

W3 验证器给出:193 个错误,16 个警告

有人知道如何解决这个问题吗?或者这是我将不得不放弃的东西......

4

2 回答 2

3

尝试html5lib。它是纯 Dart 中符合规范的 html5 解析器。您应该能够读取格式错误的 html,然后使用 document.outerHtml 获取格式正确的字符串。

于 2012-10-12T06:50:06.133 回答
1

如果我站在你的立场上,我会采取以下方法之一:

  • 如果您碰巧在您的服务器上使用 Python,那么您可以使用 lxml 和 Beautiful Soup 解析器来解析 HTML 并从中获取您想要的任何信息。

  • 从 HTML 中找出您想要的内容并使用正则表达式。确保打开多行模式,以便您可以针对整个文档而不是一次一行运行正则表达式。是的,这很脆弱,但脆弱程度取决于你想要什么数据以及你使用什么样的正则表达式来获取它。

  • 将 Beautiful Soup 移植到 Dart 并立即成为 Dart 界的名人;)

于 2012-10-11T18:35:34.520 回答