mochiwebパーサーを使用して画像のサイズをカウントしないアルゴリズム

マルチン・マジュースキー

このhttps://ppolv.wordpress.com/2008/05/09/fun-with-mochiwebs-html-parser-and-xpath/アルゴリズムを機能させようとしていますしたがって、すべてがコンパイルされ、かなりうまく機能しています(私はhtmlページのサイズを取得しています)が:

私が期待したこと:

HTMLのサイズ

画像のサイズ

スクリプトのサイズ

私が得るもの:

HTMLのサイズ

何があっても画像のサイズがゼロに等しい

スクリプトのサイズは何があってもゼロに等しい

私は何時間も見逃していたエラーや何かを見つけようとしていましたが、何が悪いのかわかりません。コード:

-module(test).
-author("Hubert").

%% API
-export([printing/4]).
-export([page_info/1]).
-export([got_page_info/3]).
-export([content_length/1]).
-export([spawn_workers/3]).
-export([get_info/2]).
-export([get_url_context/1]).
-export([wait_for_responses/2]).

%declaring record that will hold number of images, css and scripts
-record(state, {page,timer,errors,img,css,script}).

page_info(URL) ->
  inets:start(),
  case httpc:request(URL) of
    {ok,{_,Headers,Body}} ->
      got_page_info(URL,content_length(Headers),Body);
    {error,Reason} ->
      {error,Reason}
  end.

got_page_info(URLpassed, PageSize,Body) ->
  %getting the parsed version of website
  Tree = mochiweb_html:parse(Body),

  %particular files being listed and removing duplicates
  Imgs = rDup(mochiweb_xpath:execute("//img/@src",Tree)),
  %css does not work, do not know why
  %Css = rDup(mochiweb_xpath:execute("//link[@rel=’stylesheet’]/@href",Tree)),
  Scripts = rDup(mochiweb_xpath:execute("//script/@src",Tree)),

  %preapring URL
  URL = get_url_context(URLpassed),
      spawn_workers(URL,img,lists:map(fun  binary_to_list/1,Imgs)),
  spawn_workers(URL,script,lists:map(fun  binary_to_list/1,Scripts)),
  %Starts a timer which will send the message Msg to Dest after Time milliseconds.
  TRef = erlang:send_after(10000,self(),timeout),
  State = #state{page=PageSize,
    timer=TRef,
    errors=[],
    img=0,
    css=0,
    script=0},

  %number of elements -> so number of responses we should wait for
  wait_for_responses(State,length(Imgs)  + length(Scripts)),
  {ok}.

content_length(Headers) ->
  %proplists:get_value(Key,List,Default)
  %returns the length of the content
  list_to_integer(proplists:get_value("content-length",Headers,"0")).

%function that removes dulpicate
rDup(L) ->
  sets:to_list(sets:from_list(L)).

%spawn workers for every URl, who send back info about components -> getinfo
spawn_workers(URLctx,Type,URLs) ->
  lists:foreach(fun (Url) -> spawn( fun () ->
                                    self() ! {component, Type,Url,get_info(URLctx,Url)}
                                    end)
              end, URLs).

get_url_context(URL) ->
  {ok,{http,_,Root,_Port,Path,_Query}} = http_uri:parse(URL),
  Ctx = string:sub_string(Path,1, string:rstr(Path,"/")),
  {"http://"++Root,Ctx}. %% gib my url with context

get_info(URlctx,Url) ->
  FullURL = full_url(URlctx,Url),
  case httpc:request(head,{FullURL,[]},[],[]) of
    {ok, {_,Headers,_Body}} ->
      {ok,content_length(Headers)};
    {error,Reason} ->
      {error,Reason}
  end.


%FULL URL FUNCTIONS
%% abs url inside the same server ej: /img/image.png
full_url({Root,_Context},ComponentUrl=[$/|_]) ->
  Root ++ ComponentUrl;
%% full url ej: http://other.com/img.png
full_url({_Root,_Context},ComponentUrl="http://"++_) ->
  ComponentUrl;
% everything else is considerer a relative path.. obviously its wrong (../img)
full_url({Root,Context},ComponentUrl) ->
  Root ++ Context ++ "/" ++ ComponentUrl.

%collect infos recieved from wait_for_resposnses and add them to proper field of State
collect_info(State = #state{css=Css},css,_URL,{ok,Info}) ->
         State#state{css = Css + Info};
collect_info(State = #state{img=Img},img,_URL,{ok,Info}) ->
         State#state{img = Img + Info};
collect_info(State = #state{script=Script},script,_URL,{ok,Info}) ->
         State#state{script = Script + Info};
collect_info(State = #state{errors=Errors},_Type,URL,{error,Reason}) ->
         State#state{errors=[{URL,Reason}|Errors]}.

%messages from workers
wait_for_responses(State,0) ->
    finalize(State,0);

wait_for_responses(State,Counter) ->
    receive
      {component,Type,URL,Info} ->
          wait_for_responses(collect_info(State,Type,URL,Info),Counter - 1);
      timeout -> finalize(State,Counter)
    end.

%prepares variables for printing
 finalize(State,Left) ->
  PageSize =  State#state.page,
  ImgSize =  State#state.img,
  CssSize =  State#state.css, %maybe one day will work
  ScriptSize =  State#state.script,
  Errors =  State#state.errors,
  TRef =  State#state.timer,
  erlang:cancel_timer(TRef),
  printing(PageSize,ImgSize,CssSize,ScriptSize).

printing(PageSize,ImgSize,CssSize,ScriptSize)->
  io:format("html size: ~.2fkb~n",[PageSize/1024]),
  io:format("images size: ~.2fkb~n",[ImgSize/1024]),
  io:format("script size: ~.2fkb~n",[ScriptSize/1024]),
 % io:format("stylesheet size: ~.2fkb~n",[CssSize/1024]),
  {ok}.
パスカル

問題は関数にあります:

spawn_workers(URLctx,Type,URLs) ->
  lists:foreach(fun (Url) -> spawn( fun () ->
                                    self() ! {component, Type,Url,get_info(URLctx,Url)}
                                    end)
              end, URLs).

self()は生成されたプロセスで評価されるため、応答を自身に送信します。プロセスを生成する前に、変数に自分自身を割り当てます。

spawn_workers(URLctx,Type,URLs) ->
  Pid = self(),
  lists:foreach(fun (Url) -> spawn( fun () ->
                                    Pid ! {component, Type,Url,get_info(URLctx,Url)}
                                    end)
              end, URLs).

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マージソートを使用しない反転カウントアルゴリズム(c ++)

分類Dev

compareToを使用しないソートアルゴリズム

分類Dev

相対レイアウトの背景画像がフォームの画面サイズを取得しない

分類Dev

相対レイアウトの背景画像がフォームの画面サイズを取得しない

分類Dev

サイクルソートアルゴリズムでは、アルゴリズムの不安定な性質を観察するケースを探していました

分類Dev

ジャグリングアルゴリズムは右回転をサポートしていますか?

分類Dev

CSSを使用した背景画像のズームインとズームアウト

分類Dev

アルゴリズムを探しています:ラスター画像のスケルトン生成

分類Dev

T9なしで、キーパッドシーケンスの可能な単語をカウントするための効率的なアルゴリズム

分類Dev

私のJavacardはどの暗号化アルゴリズムをサポートしていますか

分類Dev

iOS 8ユニバーサルアプリのアセットカタログとサイジングクラスを使用した画像サイズ?

分類Dev

2Dゲームアルゴリズム-画面サイズに基づいてオブジェクトの速度を計算します

分類Dev

ウェブサイトをスクロールしながら画像のサイズを変更していますが、サイズ変更用のアニメーションの作成方法がわかりません

分類Dev

Apache Beamは、Apache Flinkのように、反復アルゴリズムをサポートしていますか?

分類Dev

新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

分類Dev

バッファを使用して画像をダウンスケール/補間するアルゴリズム?

分類Dev

divコンテナよりも大きい画像のサイズをどのように変更して完全に収まるようにしますか(自動サイズ変更、ズームアウトなど)

分類Dev

可能なパターンの数を数えるアルゴリズムを探しています

分類Dev

可能なパターンの数を数えるアルゴリズムを探しています

分類Dev

クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

分類Dev

SoapHttpClientProtocolとTLS1.2-クライアントとサーバーは共通のアルゴリズムを持っていないため、通信できません

分類Dev

クライアントとサーバーは共通のアルゴリズムを持っていないため、通信できません-SSLStream

分類Dev

背景サイズのカバーがアスペクト比を維持していない、Androidクローム

分類Dev

カーニハンのビットカウントアルゴリズムの背後にあるロジックを説明してください

分類Dev

カスタムレイアウトを使用してシークバーでリストビューのテキストサイズを変更する

分類Dev

3ウェイタイブレーカーを使用したPythonの効率的なソートアルゴリズム

分類Dev

サインアルゴリズムが機能しない

分類Dev

選択アルゴリズムを使用したコンパイル時の再帰的ソート

分類Dev

カラツバアルゴリズム、最大コールスタックサイズを超えました

Related 関連記事

  1. 1

    マージソートを使用しない反転カウントアルゴリズム(c ++)

  2. 2

    compareToを使用しないソートアルゴリズム

  3. 3

    相対レイアウトの背景画像がフォームの画面サイズを取得しない

  4. 4

    相対レイアウトの背景画像がフォームの画面サイズを取得しない

  5. 5

    サイクルソートアルゴリズムでは、アルゴリズムの不安定な性質を観察するケースを探していました

  6. 6

    ジャグリングアルゴリズムは右回転をサポートしていますか?

  7. 7

    CSSを使用した背景画像のズームインとズームアウト

  8. 8

    アルゴリズムを探しています:ラスター画像のスケルトン生成

  9. 9

    T9なしで、キーパッドシーケンスの可能な単語をカウントするための効率的なアルゴリズム

  10. 10

    私のJavacardはどの暗号化アルゴリズムをサポートしていますか

  11. 11

    iOS 8ユニバーサルアプリのアセットカタログとサイジングクラスを使用した画像サイズ?

  12. 12

    2Dゲームアルゴリズム-画面サイズに基づいてオブジェクトの速度を計算します

  13. 13

    ウェブサイトをスクロールしながら画像のサイズを変更していますが、サイズ変更用のアニメーションの作成方法がわかりません

  14. 14

    Apache Beamは、Apache Flinkのように、反復アルゴリズムをサポートしていますか?

  15. 15

    新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

  16. 16

    バッファを使用して画像をダウンスケール/補間するアルゴリズム?

  17. 17

    divコンテナよりも大きい画像のサイズをどのように変更して完全に収まるようにしますか(自動サイズ変更、ズームアウトなど)

  18. 18

    可能なパターンの数を数えるアルゴリズムを探しています

  19. 19

    可能なパターンの数を数えるアルゴリズムを探しています

  20. 20

    クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

  21. 21

    SoapHttpClientProtocolとTLS1.2-クライアントとサーバーは共通のアルゴリズムを持っていないため、通信できません

  22. 22

    クライアントとサーバーは共通のアルゴリズムを持っていないため、通信できません-SSLStream

  23. 23

    背景サイズのカバーがアスペクト比を維持していない、Androidクローム

  24. 24

    カーニハンのビットカウントアルゴリズムの背後にあるロジックを説明してください

  25. 25

    カスタムレイアウトを使用してシークバーでリストビューのテキストサイズを変更する

  26. 26

    3ウェイタイブレーカーを使用したPythonの効率的なソートアルゴリズム

  27. 27

    サインアルゴリズムが機能しない

  28. 28

    選択アルゴリズムを使用したコンパイル時の再帰的ソート

  29. 29

    カラツバアルゴリズム、最大コールスタックサイズを超えました

ホットタグ

アーカイブ