0

bashスクリプトは初めてですが、以前の回答は役に立ちませんでした。

WebページからIDを取得しようとしていますが、解析page1してIDのリストを取得し、それらを使用して対応するWebページを解析する必要があります。

スクリプトの書き方がわからないのですが…

これが私がやりたいことです:

  1. url1に従って解析しregexpます。出力:抽出されたIDのリスト(、、、101など102103
  2. 各URLを出力IDで解析します。たとえば、parse(http://someurl/101)、次にparse(http://someurl/102)などです。

これまでのところ、私はこのコマンドを思いついた:

curl http://subtitle.co.il/browsesubtitles.php?cs=movies | grep -o -P '(?<=list.php\?mid=)\d+'  

上記のコマンドは機能し、IDのリストを提供します。

次のステップについて何かアドバイスはありますか?私は正しい方向に進んでいますか?

ありがとう!

4

3 に答える 3

0

次のステップは、おそらくすべてのIDでループを実行するでしょう。

parse_url () {
    for id in $(grep -o -P '(?<=list.php\?mid=)\d+' "$1"); do
        # Use $id
        url="http://someurl/$id"
        # or parse for the URL with the ID
        url="$(grep -o -P 'http://[a-zA-Z./%0-9:&;=?]*list.php\?mid=$id[a-zA-Z./%0-9:&;=?]*' "$1")"
        # Get page
        new_page_file="$(mktemp)"
        wget -q -O "$new_page_file" "$url"
        # Parse url
        parse_url "$new_page_file"
        # Delete old temporary file
        rm "$new_page_file"
    done
}

wget -q -O file.html http://subtitle.co.il/browsesubtitles.php?cs=movies
parse_url file.html

ここではparse_url、と呼ばれる関数を定義しました。これは、引数として渡されたファイルで見つかったすべてのIDを繰り返し処理します(つまり$1、関数に渡された最初の引数です)。

次に、IDを使用してURLを生成するか、同じファイルからURLをgrepして、IDを抽出することができます。URLを検索するための正規表現は、URLが特定の形式であることを前提としていることに注意してください。

  1. 「http://」で始まります
  2. 角かっこで囲まれた文字のみが含まれます

ページをダウンロードするには、コマンドを使用して一時ファイルを作成しますmktemp。bashスクリプトを初めて使用するとおっしゃっていたので、表示される$(...)sについて簡単に説明します。括弧で囲まれたコマンドまたは一連のコマンドを実行してから実行し、標準出力をキャプチャして、元の場所に配置し$(...)ます。この場合、$new_page_file変数に割り当てる二重引用符の中に配置されます。したがって$new_page_file、一時ファイルを保存するために作成されたランダムなファイル名の名前が含まれます。

次に、URLをその一時ファイルにダウンロードし、関数を呼び出して解析してから、削除します。

最初に関数を呼び出すには、最初のURLをファイルにダウンロードしてから、file.htmlそのファイル名を引数として渡して関数を呼び出します。

編集: Barmarの回答に基づいて再帰を追加しました

これが少し役立つことを願っています=)

于 2012-10-03T23:35:55.057 に答える
0

この種のclihtml解析は、まさに私がXidelを作成した目的です。(そして、正規表現の代わりにxpathを使用するので、クトゥルフを呼び出すことはありません...(遅すぎる、彼はすでにそこにいます、私はちょうど私のバスルームに行きました、そしてこの本当に奇妙な音がありました...))

IDが必要な場合

それらを使用して、対応するWebページを解析します。

IDを明示的に抽出する代わりに、リンクをたどることができます。

例:リンクされているすべてのページのタイトルを印刷する

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -f '//a[starts-with(@href,"list.php")]' -e //title

//a 宛先のすべてのリンクをたどることによってstarts-with(@href,"list.php")。(-fリンクをたどることを意味します-e。:はデータを抽出することを意味します。)

または、ビューのURLで大きなテキストブロックを抽出したい場合:(言語がわからない、何を言っているのかわからない...)

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -f '//a[starts-with(@href,"list.php")]/replace(@href, "list.php[?]mid=", "view.php?id=")' -e 'css("#profilememo")'

または、本当に個別にIDが必要な場合は、最初にIDを抽出できます。

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -e '//a[starts-with(@href,"list.php")]/substring-after(@href,"mid=")' -f '//a[starts-with(@href,"list.php")]' -e //title

または、一時変数linksを使用してすべてのリンクを格納する方が簡単です。

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -e '(links:=//a[starts-with(@href,"list.php")])[0]' -e '$links/substring-after(@href,"mid=")' -f '$links' -e //title
于 2012-10-03T23:37:39.290 に答える
0

これは再帰アルゴリズムであるため、関数を記述する必要があります。

parse_url() {
  ids=$(curl "$1" | grep -o -P '(?<=list.php\?mid=)\d+')
  for id in $ids
  do echo $id
     parse_url "http://someurl/$id"
  done
}

開始ページでこの関数を呼び出すと、そのページで見つかったすべての ID がエコーされ、すべてのhttp://someurl/IDページが再帰的に解析されます。

これは、すべてのページで見つかったすべての ID をエコーするだけです。見つかった ID を使用して他にやりたいことがある場合は、このスクリプトをそれにパイプすることができます。また、重複の抑制は行っていないため、ページ間に後方参照があると、このスクリプトが永久にループする可能性があります。配列に既に表示されている ID を追跡し、再帰する前にこれを確認できます。

于 2012-10-03T23:26:19.010 に答える