2012-06-19 59 views
0

我有這個小班:我想在python解析HTML

class HTMLTagStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, data): 
     self.fed.append(data) 
    def handle_starttag(self, tag, attrs): 
     if tag == 'a': 
      return attrs[0][1] 
    def get_data(self): 
     return ''.join(self.fed) 

解析HTML代碼:

<div id="footer"> 
<p>long text.</p> 
<p>click <a href="somelink.com">here</a> 
</div> 

這是結果我得到:long text click here
但我想得到:long text click somelink.com

有沒有辦法做到這一點?

+0

如果有意願......我知道我會在這裏爲這個建議拍攝,但如果你想要做的是刪除標籤,你可以使用正則表達式:-) – Simon

+4

[請不要使用RegEx解析HTML](http://stackoverflow.com/a/1732454/189134)使用[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)或爲其設計的其他庫代替。 – Andy

回答

0

我其實檢查了這個新的HTML解析器庫,並提出了該解決方案:

from htmldom import htmldom 
dom = htmldom.HtmlDom().createDom("""<div id="footer"> 
<p>long text.</p> 
<p>click <a href="somelink.com">here</a> 
</div>"""); 
nodes = dom.find("p").children(all_children = True) # this makes all text nodes to be in the set. 
for node in nodes: 
    if node._is("a"): 
     print(node.attr("href").strip()) 
    elif node._is("text"): 
     print(node.getNode().text, end = '', sep = ' ') 

您可以從Sourceforge或Python包指數下載庫:HtmlDom,適用於蟒蛇3.x中,圖書館的文件不是很好,但它是可以理解的。希望你喜歡答案:)

+0

您可以在[Documentation](http://thehtmldom.sourceforge.net/)上找到文檔。 – coder

8

看看BeautifulSoup ..它會這麼做,還有更多。

或者你可以使用正則表達式/字符串操作去除你想要的數據。從長遠來看,使用像BeautifulSoup這樣的東西將會獲得回報,特別是如果您希望做更多這樣的事情。

這裏有一種方法使用BeautifulSoup來提取您的HTML數據單/只鏈接(我不是這方面的專家,所以可能有其他更好的辦法 - 建議/更正歡迎)。

from BeautifulSoup import BeautifulSoup 
s = """<div id="footer"> 
     <p>long text.</p> 
     <p>click <a href="somelink.com">here</a> 
     </div>""" 

soup = BeautifulSoup(s) 
your_link = soup.find('a', href=True)['href'] 
print 'long text click', your_link 

會打印:從HTML標籤

x = re.compile(r'<.*?>') 
stripped = x.sub('', html) 

,你也想提取一些屬性(比如HREF):

long text click somelink.com

+0

@ user1307624如果這解決了您的問題,請考慮[通過點擊勾號接受此答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 )在我的答案旁邊。這將標誌着這個問題的解決,並獎勵我們兩個重要的點。謝謝。 – Levon

0

這不會爲你工作。正如Levon指出的那樣:你應該選擇BeautifulSoup。

+0

實際上這將不會工作,因爲op想要href屬性 – Simon

+0

啊,對。感謝您指出了這一點。沒有注意到這個問題。 – bcelary

+0

我已更改我的答案以反映所提問題... – bcelary

0

更換此:

def handle_starttag(self, tag, attrs): 
    if tag == 'a': 
     return attrs[0][1] 

有了這個:

def handle_starttag(self, tag, attrs): 
    if tag == 'a': 
     value = dict(attrs).get("href", None) 
     if value: 
      # add extra spaces since you dont sanitize 
      # them in get_data 
      self.fed.append(" %s " % value) 

應該用什麼樣的工作。或者不是,取決於html源代碼。這就是爲什麼我們有BeatifulSoup。