2012-07-02 92 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'