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 を自分で修正することはできません。私が推測する問題は、その形式が正しくないためです。

上記の関数を使用して解析しようとしている Web サイトのコードは次のとおりです: http://pastebin.com/KvMN9AuF

W3 Validator の結果: 193 エラー、16 警告

この問題に対処する方法を知っている人はいますか? それとも、これは諦めるしかないのでしょうか...

4

2 に答える 2

3

html5libを試してください。これは、純粋な Dart の仕様に準拠した html5 パーサーです。不正な形式の html を読み取ってから、document.outerHtml を使用して適切な形式の文字列を取得できるはずです。

于 2012-10-12T06:50:06.133 に答える
1

私があなたの立場にあった場合、私はこれらのアプローチの1つを取ります:

  • サーバーでPythonを使用している場合は、Beautiful Soupパーサーでlxmlを使用して、HTMLを解析し、そこから必要な情報を取得できます。

  • HTMLから必要なものを見つけ出し、正規表現を使用します。一度に1行ではなく、ドキュメント全体に対して正規表現を実行できるように、必ず複数行モードをオンにしてください。はい、これは壊れやすいですが、どの程度壊れやすいかは、必要なデータと、それを取得するために使用する正規表現の種類によって異なります。

  • 美しいスープをダートに移植し、ダートの世界ですぐに有名人になりましょう;)

于 2012-10-11T18:35:34.520 に答える