我有一些html文件,想要在某些标签之间提取内容: 页面标题 这里有一些标记的内容。
<p>A paragraph comes here</p>
<p>A paragraph comes here</p><span class="more-about">Some text here</span><p class="en-cpy">Copyright © 2012 </p>
我只想要这些标签:head,p
但正如在第二段中可以看到的那样,最后一个标签是以p开头但不是我的欲望标签,我不想要它的内容。
我使用以下脚本来提取我想要的文本,但是我无法过滤出标签,例如我示例中的最后一个标签....如何仅提取<p>
标签?
grep "<p>" $File | sed -e 's/^[ \t]*//'
我必须补充一点,最后一个标签(我不希望出现在输出中)就在我想要的一个标签之后(如我的例子中所示)并使用grep命令该行的所有内容将作为输出返回...(这是我的问题)
答案 0 :(得分:3)
别。尝试使用regex
来解析 HTML 将是painful。使用Ruby
和Nokogiri
之类的内容,或您熟悉的类似语言+库。
答案 1 :(得分:0)
xmllint --html --xpath "//*[name()='head' or name()='p']" "$file"
如果您正在处理损坏的HTML,则可能需要使用不同的解析器。这是使用lxml
基本相同的“单行”。只需将脚本传递给您的网址
#!/usr/bin/env python3
from lxml import etree
import sys
print('\n'.join(etree.tostring(x, encoding="utf-8", with_tail=False).decode("utf-8") for x in (lambda i: etree.parse(i, etree.HTMLParser(remove_blank_text=1, remove_comments=1)).xpath("//*[name()='p' or name()='head']"))(sys.argv[0])))
答案 2 :(得分:0)
在&lt; p&gt;之间提取文字和&lt; / p&gt;,试试这个
perl -ne 'BEGIN{$/="</p>";$\="\n"}s/.*(<p>)/$1/&&print' < input-file > output-file
或
perl -n0l012e 'print for m|<p>.*?</p>|gs'