我想<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
这件事该怎么办呢?
答案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 解析器的要求:您需要解析 HTML。珀尔的HTML::TreeBuilder, 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'