web-dev-qa-db-ja.com

2つのタグの間のテキスト

これら2つのタグ<tr> </tr> –の間にあるものをHTMLドキュメントから取得したいと思います。現在、htmlパーサーに必要な特定のhtml要件はありません。私は<tr></tr>に一致するものを必要とし、その間にすべてを取得します。複数のtrsが存在する可能性があります。私はawkを試しましたが、うまくいきましたが、何らかの理由で、抽出された各行の複製ができてしまいます。

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

これについてどうやって行くの?

24
TechJack

すべての_..._のうち_<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を確認してください(通常ではありませんが、可能です)存在する場合は、存在しないものに変更します。

15
xx4h

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

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

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

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パーサーは保証されていないと言っていましたが、 NokogiriRubyで使用するのは非常に簡単で、コマンドが単純になります。

_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>_の間の内容を取得します。

5
N.N.

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 を検討できます。

1
kenorb

それが<tr>sの簡単なリストである場合、これは役立ちます:

Perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

乾杯

0
eswues

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"
0
kenorb