2012-10-08 44 views
2

我無法在python中找到具體的評論,例如<!-- why -->。 我的主要原因是找到2條具體評論內的所有鏈接。像解析器一樣。 我試圖與Beautifulsoup使用python查找HTML代碼中的具體評論

import urllib 
over=urlopen("www.gamespot.com").read() 
soup = BeautifulSoup(over) 
print soup.find("<!--why-->") 

但它不工作。 我想我可能不得不使用regex而不是Beautifulsoup

請幫忙。

例: 我們有HTML代碼這樣

<!--why--> 
www.godaddy.com 
<p> nice one</p> 
www.wwf.com 
<!-- why not--> 

編輯:2個註釋之間,其他的東西,如標籤,可能存在。

我需要存儲所有的鏈接。

+0

舉一個真實的例子,這將有助於每個人。 –

回答

6

如果你想所有的評論,你可以使用findAll與可呼叫:

>>> from bs4 import BeautifulSoup, Comment 
>>> 
>>> s = """ 
... <p>header</p> 
... <!-- why --> 
... www.test1.com 
... www.test2.org 
... <!-- why not --> 
... <p>tail</p> 
... """ 
>>> 
>>> soup = BeautifulSoup(s) 
>>> comments = soup.findAll(text = lambda text: isinstance(text, Comment)) 
>>> 
>>> comments 
[u' why ', u' why not '] 

一旦你得到了他們,你可以使用慣用的招數走動:

>>> comments[0].next 
u'\nwww.test1.com\nwww.test2.org\n' 
>>> comments[0].next.split() 
[u'www.test1.com', u'www.test2.org'] 

取決於頁面的實際外觀,您可能需要稍微調整一下,然後您必須選擇您想要的評論,但這應該可以幫助您開始。

編輯:

如果你真的想只是看起來像一些具體的文字的人,你可以這樣做

>>> comments = soup.findAll(text = lambda text: isinstance(text, Comment) and text.strip() == 'why') 
>>> comments 
[u' why '] 

,或者你可以使用列表理解在事後進行篩選:

>>> [c for c in comments if c.strip().startswith("why")] 
[u' why ', u' why not '] 
+0

不錯的解決方案!我沒有意識到我必須導入'Comment'並且無法讓它工作。 –

+0

源代碼可能有很多註釋塊。我只需要搜索以「爲什麼」開頭的那些。這是否以這種方式工作? –

+0

@georgemano:我編輯了它。通過Python教程閱讀可能是值得的 - 有很多方法可以做一些簡單的事情,一旦你知道它們,但很難猜到。 – DSM