2012-07-02 47 views
0

我有一些html文件,并且想要提取一些标签之间的内容: 页面标题 某些标记的内容在这里。查找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 &copy; 2012 </p> 

我只是想这些标签:头,对 但在第二段可以看出,最后一个标签是与P开始,但不是我的愿望标签,我不希望它的内容。 我用下面的脚本提取我想要的文字,但我不能筛选出标记,如最后一次在我的例子....怎么可能只提取<p>标签?

grep "<p>" $File | sed -e 's/^[ \t]*//' 

我要补充的是,最后的标签(这是我不希望出现在输出)是我所期望的标签之一(这是在我的例子),并使用grep命令之后的所有该行的内容将返回作为输出...(这是我的问题)

回答

3

不要。试图用regex解析HTML将会是painful。使用类似RubyNokogiri或您熟悉的类似语言+库。

+1

XSLT是一种通用工具(和语言)。 Google for'xsltproc'的例子。 – tripleee

+0

如果您拥有有效的XHTML(即有效的XML),那么这绝对是一条更简单的路线。 –

+0

哇,XSLT似乎是一个奇怪的工具,但我没有时间。我必须在1小时内完成它,似乎我必须花时间学习如何创建xsl文件。 – Hakim

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]))) 
+0

它不起作用... – Hakim

+0

“不工作”没有告诉我什么。当然你需要libxml,或者你可以选择使用任何其他可以处理xpath的命令行工具。 – ormaaj

+0

是的,我有libxml,但似乎这个命令回应了文件的所有内容。 – Hakim

0

提取< P>和</P>之间的文本,试试这个

perl -ne 'BEGIN{$/="</p>";$\="\n"}s/.*(<p>)/$1/&&print' < input-file > output-file 

perl -n0l012e 'print for m|<p>.*?</p>|gs'