<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
sed
awk
これに適していない場合は、適切なHTMLパーサーを使用する必要があります。たとえばhxselect
、w3.orgの場合:
<htmlfile hxselect -s '\n' -c 'tr'