Shell-Script

兩個標籤之間的文本

  • January 25, 2019

我想<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

如何解決這個問題?

...如果你只想<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

引用自:https://unix.stackexchange.com/questions/64645