两个标签之间的文本

两个标签之间的文本

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

这件事该怎么办呢?

答案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'

答案4

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"

相关内容