これら2つのタグ<tr> </tr>
–の間にあるものをHTMLドキュメントから取得したいと思います。現在、htmlパーサーに必要な特定のhtml要件はありません。私は<tr>
と</tr>
に一致するものを必要とし、その間にすべてを取得します。複数のtr
sが存在する可能性があります。私はawkを試しましたが、うまくいきましたが、何らかの理由で、抽出された各行の複製ができてしまいます。
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
これについてどうやって行くの?
すべての_...
_のうち_<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を確認してください(通常ではありませんが、可能です)存在する場合は、存在しないものに変更します。
HTMLパーサーを保証する要件があります:HTMLを解析する必要があります。 Perlの HTML :: TreeBuilder 、Pythonの BeautifulSoup などは簡単です使いやすく、複雑で壊れやすい正規表現を書くよりも簡単です。
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
sed
とawk
はこのタスクにはあまり適していません。適切なHTMLパーサーを使用する必要があります。たとえば、w3.orgのhxselect
:
<htmlfile hxselect -s '\n' -c 'tr'
Ruby
が利用可能な場合、次のことができます
_Ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file
_
ここで、file
は入力htmlファイルです。コマンドは、Rubyワンライナーを実行します。最初に、file
からすべての行を読み取り、それらをストリング_readlines.join
_に結合します。次に、ストリングから改行に関係なく、1文字以上の_<tr>
_と_<\/tr>
_の間のすべてを選択します。[/(?<=<tr>).+(?=<\/tr>)/m]
。次に、_<tr>
_または_</tr>
_文字列から、gsub(/<\/?tr>/, "")
(ネストされたtr
タグを処理するために必要です)最後に、文字列puts
を出力します。
あなたはhtmlパーサーは保証されていないと言っていましたが、 Nokogiri をRuby
で使用するのは非常に簡単で、コマンドが単純になります。
_Ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file
_
_-rnokogiri
_はNokogiriをロードします。 Nokogiri::HTML(readlines.join)
はfile
のすべての行を読み取ります。 xpath("//tr")
はすべてのtr
要素を取得し、_map { |e| e.content }
_は各要素のコンテンツを取得します。つまり、_<tr>
_と_</tr>
_の間の内容を取得します。
grep
複数行にわたってtr
タグ内のコンテンツを取得するには、まずxargs
を介してコンテンツを渡します。次に例を示します。
curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"
内部HTMLのみを返すには、次を使用します。
curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"
perlre
拡張パターン の構文を確認してください。
注:より高速なパフォーマンスを得るには、同様の構文を持つ ripgrep
を検討できます。
それが<tr>
sの簡単なリストである場合、これは役立ちます:
Perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log
乾杯
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
xpup
を使用したHTML/XML解析の例(XPathをサポート):
xpup -f myfile.html "//tr"