2 つのラベル間のテキスト

2 つのラベル間のテキスト

<tr> </tr>HTMLドキュメントでこれら2つのタグ間のすべてのコンテンツを検索したいと思います。現在、htmlパーサーを保護するための特定のhtml要件はありません。私は単に一致する必要があり<tr></tr>それらの間のすべてを取得し、いくつかのことができますtr。私はawkを試しましたが、うまくいきましたが、何らかの理由で抽出したすべての行に重複する項目を提供しました。

awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile

この問題をどうすればよいですか?

答え1

...あなたがしたい場合<tr>...</tr>

grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE

複数行の場合は、次のようにします。

tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE

まずHTMLFILEで「|」文字(一般的ではありませんが可能)を確認し、存在する場合は存在しない文字に変更してください。

答え2

HTMLパーサーには1つの要件があります。つまり、HTMLを解析する必要があります。真珠HTML::ツリービルダー、Python美しいスープ他のものは、複雑で壊れやすい正規表現を書くよりも使いやすく簡単です。

perl -MHTML::TreeBuilder -le '
    $html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
    foreach ($html->look_down(_tag => "tr")) {
        print map {$_->as_HTML()} $_->content_list();
    }
' input.html

または

python -c 'if True:
    import sys, BeautifulSoup
    html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
    for tr in html.findAll("tr"):
        print "".join(tr.contents)
' input.html

答え3

sedawkこれに適していない場合は、適切なHTMLパーサーを使用する必要があります。たとえばhxselect、w3.orgの場合:

<htmlfile hxselect -s '\n' -c 'tr'

答え4

pup

使用例pup(これはCSSセレクター):

pup -f myfile.html tr

ラベルなしでテキストのみを印刷するには、以下を使用しますpup -f myfile.html tr text{}

ここにいくつかの例がありますcurl

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

使用例xpupHTML/XML 解析の場合 (XPath サポート):

xpup -f myfile.html "//tr"

関連情報