0

<div id="links"></table>タグの間のすべてのリンクを抽出する方法を見つけなければなりません。また、複数のリンクがある場合は、URL の間に「\n」文字を追加する必要があります: "$URL1\n$URL2"。

<div id="links">
<table>
<td><a href="URL">url</a></td>
<td><a href="URL">url</a></td>
</table>
<table>
..
</table>
</div>

<div>タグと最初のタグの間のもの</table>。sed以外に他の方法はありますか?

ありがとうございました。

4

4 に答える 4

2

SO に毎日投稿されているように: HTML を正規表現で処理することはできません。正規表現を使用して XML と HTML を解析するのが難しい理由の例をいくつか挙げていただけますか?

基本的な正規表現を備えた sed のように制限されたツールの場合、これは 2 倍になります。

すべてのリンクがまったく同じ形式であるなど、入力の種類が非常に限られている場合は、可能かもしれません。その場合、その形式の例を投稿する必要があります。しかし、一般的な HTML ページでは、それはできません。

あなたの例を与えられたETA:最も単純なレベルでは、各URLはすでに独自の行にあるため、適切に見えるものを選択して、不要なビットを捨てることができます:

#!/bin/sed -f
s/^<td><a href="\(.*\)">.*<\/a><\/td>$/\1/p
d

ただし、これにより URL が HTML エンコードされた形式のままになることに注意してください。このファイルを生成したスクリプトがその URL を正しく HTML エンコードしている場合、lt/gt/quot/amp エンティティ参照のインスタンスをプレーンな文字形式 '<>"&' に戻す必要があります。遭遇する可能性が高いのは &/amp だけです。これは実際、URL で非常に一般的です。

しかし!発生した可能性のある HTML エンコーディングはこれだけではありません。eacute (IRI があるので有効) や数値文字参照 (10 進数と 16 進数の両方) など、他の HTML エンティティ参照がそこにある可能性があります。Unicode を含む文字のエンコードには 200 万もの潜在的な形式があります... sed でそれぞれを個別に置き換えることは、退屈な大規模な作業になります。

ジェネレーター スクリプトがそれらのいずれも出力しないことがわかっている場合は、おそらくそれを回避できますが、HTML パーサーは依然として最適です。(または、整形式の XHTML であることがわかっている場合は、最新の言語の標準ライブラリに組み込まれている、より単純な XML パーサーを使用できます。)

于 2009-08-18T11:28:37.343 に答える
0

これは、タグを調べる代わりにURLを探すだけで可能になる場合があります。

これらがページ内の唯一のURLである場合は、次のように、引用符で囲まれたURLを検索するパターンを記述できます。

"[a-z]+://[^"]+" 
于 2009-08-18T12:13:12.780 に答える
0

Python にアクセスできる場合は、BeautifulSoup をお勧めします。HTML を操作するための優れた Python ライブラリ。次のコードは、指定されたリソース ( http://www.foo.comなどの Web ページへの完全な名前) からリンクを収集し、ファイルに保存します。お役に立てれば。

import sys, os
from urllib import urlopen
from BeautifulSoup import BeautifulSoup

fileLinksName = "links.dat"

if __name__ == "__main__":
    try:
        # get all links so far
        fileLinks = open(fileLinksName)

        links = fileLinks.read().split('\n')

        fileLinks.close()

        htmlFileSoup = BeautifulSoup(urlopen(sys.argv[1]).read())

        anchorList = htmlFileSoup.findAll('a')

        for htmlAnchor in anchorList:
            print htmlAnchor
            if 'href' in htmlAnchor:
                links.append(htmlAnchor)

        for link in links:
            print link
    except:
        print sys.exc_info()
        exit()
于 2009-08-18T12:07:04.473 に答える
0

AWK にアクセスできますか? AWK と sed の組み合わせは、次の条件を満たしていれば、目的を達成できる可能性があります。

  • html は比較的単純です。
  • html が突然変更されることはありません (つまり、内容ではなく形式が変わります)。
  • html は過度に複雑ではありません。

正規表現で HTML を処理できないというのは誤りです。一般的なケースでは、HTML (または XML) を正規表現で処理できないのは事実です。なぜなら、それらは任意のネストを許可し、正規表現は再帰を適切に (またはまったく) 実行しないためです。しかし、HTML が比較的「フラット」である場合は、正規表現を使用して多くのことを行うことができます。

大学で学んだ AWK と sed を少し忘れてしまったので、何をすべきか正確には言えませんが、これは実行可能なことだと思います。

  • 文字列を見つける<div id="links">
  • 今すぐ文字列を見つけます<table>
  • 文字列を見つけて、<td>...</td>そこからリンクを取得します (これは正規表現の部分です)。
  • var に追加します$links
  • 文字列を見つけるまで</table>
  • 最後に、$links各リンクを で区切って印刷し\nます。

繰り返しますが、これは単純なケースの単なる疑似コードです。しかし、それはうまくいくかもしれません。

Perl にアクセスできない場合でも、sed と AWK の両方がインストールされている傾向があるため、AWK について言及します。

最後に、純粋な sed ソリューションについては、この sed レシピを見て、ニーズに合わせて調整することもできます。

于 2009-08-18T13:03:42.233 に答える