2009-11-25 24 views
3

下面是一段HTML代碼(美味的):Python和BeautifulSoup,沒有找到 'A'

<h4> 
<a rel="nofollow" class="taggedlink " href="http://imfy.us/" >Generate Secure Links with Anonymous Referers &amp; Anti-Bot Protection</a> 
<span class="saverem"> 
    <em class="bookmark-actions"> 
    <strong><a class="inlinesave action" href="/save?url=http%3A%2F%2Fimfy.us%2F&amp;title=Generate%20Secure%20Links%20with%20Anonymous%20Referers%20%26%20Anti-Bot%20Protection&amp;jump=%2Fdux&amp;key=fFS4QzJW2lBf4gAtcrbuekRQfTY-&amp;original_user=dux&amp;copyuser=dux&amp;copytags=web+apps+url+security+generator+shortener+anonymous+links">SAVE</a></strong> 
    </em> 
</span> 
</h4> 

我試圖找到所有的鏈接,其中類= 「inlinesave行動」。下面的代碼:

sock = urllib2.urlopen('http://delicious.com/theuser') 
html = sock.read() 
soup = BeautifulSoup(html) 
tags = soup.findAll('a', attrs={'class':'inlinesave action'}) 
print len(tags) 

但沒有找到任何東西!

有什麼想法?

感謝

+1

如果你使用'標籤=湯會發生什麼。 findAll('a',attrs = {'class':'inlinesave'})'而不是? – 2009-11-25 12:55:05

+0

嗯...它的作品!任何合理的解釋爲什麼? – pns 2009-11-25 13:04:51

+1

多個類屬性是空格分隔的。有問題的錨已經分配了類別「inlineave」和「action」。我想這就是爲什麼尋找任何類名稱將工作。 – Haes 2009-11-25 13:20:12

回答

1

如果您想尋找與這些人恰恰是兩個類錨你,必須使用正則表達式,我認爲:

tags = soup.findAll('a', attrs={'class': re.compile(r'\binlinesave\b.*\baction\b')}) 

請記住,這個正則表達式贏得」如果類別名稱的順序顛倒(class="action inlinesave"),則工作。

下面的語句應該爲所有情況下工作(即使它看起來醜陋IMO):

soup.findAll('a', 
    attrs={'class': 
     re.compile(r'\baction\b.*\binlinesave\b|\binlinesave\b.*\baction\b') 
    }) 
+0

它只在正則表達式匹配時才起作用,所以這不是我個人的方式(如果在類之間有一個額外的空間,如果他們之間有另一個類,等等)。雖然可能會收緊一點來匹配所有可能的情況。 – 2009-11-25 13:27:37

+0

你是對的,我相應地編輯了答案。 – Haes 2009-11-25 13:58:11

+0

這被描述爲https://bugs.launchpad.net/beautifulsoup/+bug/410304中的一個錯誤。也許我們可以在未來修復? – GmonC 2009-11-25 14:09:37

0

Python字符串的方法

html=open("file").read() 
for item in html.split("<strong>"): 
    if "class" in item and "inlinesave action" in item: 
     url_with_junk = item.split('href="')[1] 
     m = url_with_junk.index('">') 
     print url_with_junk[:m] 
0

可能是這個問題是固定在verion 3.1.0,我可以解析你的,

>>> html="""<h4> 
... <a rel="nofollow" class="taggedlink " href="http://imfy.us/" >Generate Secure Links with Anony 
... <span class="saverem"> 
... <em class="bookmark-actions"> 
...  <strong><a class="inlinesave action" href="/save?url=http%3A%2F%2Fimfy.us%2F&amp;title=Gen 
... </em> 
... </span> 
... </h4>""" 
>>> 
>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup(html) 
>>> tags = soup.findAll('a', attrs={'class':'inlinesave action'}) 
>>> print len(tags) 
1 
>>> tags 
[<a class="inlinesave action" href="/save?url=http%3A%2F%2Fimfy.us%2F&amp;title=Generate%20Secure% 
>>> 

我已經用BeautifulSoup 2.1.1也試過了,它的根本不起作用。

0

你可能會做一些向前進行使用pyparsing:

from pyparsing import makeHTMLTags, withAttribute 

htmlsrc="""<h4>... etc.""" 

atag = makeHTMLTags("a")[0] 
atag.setParseAction(withAttribute(("class","inlinesave action"))) 

for result in atag.searchString(htmlsrc): 
    print result.href 

給出(長結果輸出在剪斷 '...'):

/save?url=http%3A%2F%2Fimfy.us%2F&amp;title=Genera...+anonymous+links