2010-12-02 16 views
1

私のprevious questionに続いて、hrefファイルをhtmlファイルから解析して、その文字列を私の以前の質問の解決に送ろうとしています。をカウントし、htmlファイルからすべてのhrefリンクを解析します。

これは私が持っているものですが、それは動作しません...

void ParseUrls(char* Buffer) 
{ 
    char *begin = Buffer; 
    char *end = NULL; 
    int total = 0; 

    while(strstr(begin, "href=\"") != NULL) 
    { 
     end = strstr(begin, "</a>"); 
     if(end != NULL) 
     { 
      char *url = (char*) malloc (1000 * sizeof(char)); 

      strncpy(url, begin, 100); 
      printf("URL = %s\n", url); 

      if(url) free(url); 
     } 

     total++; 
     begin++; 
    } 

    printf("Total URLs = %d\n", total); 
    return; 
} 

は基本的に私は、文字列にHREFの情報を抽出するような何か必要があります。

<a href="http://www.w3schools.com">Visit W3Schools</a>

助けていただければ幸いです。

+3

"これは機能しません"というのは、あなたのプログラムの非常に有用な説明ではありません。それはコンパイラを渡しますか?出力はありますか? –

+0

いいえ、それは単純に 'Buffer'で見つかったランダムな文字列を取得し、' ' – Jessica

答えて

0

これは実際にこのコードについてのあなたの疑問に答えるものではありませんが、HTMLParser from libxml2のようにこれを行うにはCライブラリを使用する方が信頼性が高いでしょう。

HTML解析は簡単ですが、動作することがわかっているものを使いやすくするエッジケースがあります。

+0

の間にはありません。このようなことをするために外部ライブラリを使いたくありません。 – Jessica

+0

それはいいです、幸運 –

1

このコードには多くの問題があります。

  • ループの周りに1ずつ増分が始まります。これは同じhrefが何度も繰り返し見つけられることを意味します。 beginendの後に移動するつもりだったと思いますか?

  • 通常、strncpyは100文字(HTMLが長くなるため)をコピーし、文字列をヌル終了しません。あなたは欲しいurl[100] = '\ 0'どこかで

  • なぜ1000文字を割り当てて100だけ使うのですか?

  • endはbeginで始まります。これは、href = ""の前にそれがある場合は、代わりにそれを見つけることを意味します。

  • endは何も使用しません。

  • URLの最後に引用符を検索しないのはなぜですか?

上記の問題(URLの終了を追加)が与えられていると、問題なく動作します。それはスペースの割り当てについては

URL = <a href="/email_services.php">Email services</a> 
URL = a href="/email_services.php">Email services</a> 
URL = href="/email_services.php">Email services</a> 
URL = href="/email_services.php">Email services</a> 
Total URLs = 4 

を印刷し

"<a href=\"/email_services.php\">Email services</a> " 

を考えると

は、私は(このstartを呼び出し、「あなたは "HREF = \" のはstrstrの結果を維持すべきだと思いますあなたが必要とするサイズはend - startです(終了NULの場合+1)。多くのスペースを割り当て、strncpyでNULとロバートの親のオスの兄弟を追加してください。

また、href =はアンカーと一意ではないことを覚えておいてください。他のタグにも表示されます。

+0

ポール、ポインタありがとうございました。最初の100文字をチェックしたいと思っていたので、テスト目的のためだけに100を使用しました。いずれにしても、私は1024の割り当てを受けています。私はこれを行うのを助ける可能性のあるスニペットをあなたに持っていますか? – Jessica

+0

OK、投稿したコードを修正するにはどうすればいいですか? – Jessica

+0

これは学習の練習であると仮定しても、まだ解読できない場合は、質問を更新してください。 –

関連する問題