2008-11-13 126 views
5

鑑於像分解HTML鏈接文本和目標

<a href="urltxt" class="someclass" close="true">texttxt</a> 

的HTML鏈接我如何可以隔離鏈接和文本?

更新

我用美麗的湯,而我無法弄清楚如何做到這一點。

我做

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url)) 

links = soup.findAll('a') 

for link in links: 
    print "link content:", link.content," and attr:",link.attrs 

我得到

*link content: None and attr: [(u'href', u'_redirectGeneric.asp?genericURL=/root /support.asp')]* ... 
... 

爲什麼我缺少的內容?

編輯:闡述了 '堅持' 的建議:)

+0

有可能是urllib.urlopen(url)有問題。嘗試打印出來,看看你得到什麼。它應該是網頁的直接HTML。 – 2008-11-13 00:48:46

+0

另外,「卡住!」不是非常具有描述性。顯示更多代碼以及究竟發生了什麼問題。 – 2008-11-13 01:05:04

+0

感謝您的額外信息,它使得查看發生的事情變得更加容易。 – 2008-11-13 02:31:42

回答

8

使用Beautiful Soup。自己動手比看起來更難,使用經過驗證和測試的模塊會更好。

編輯:

我想你想:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read()) 

順便說一句,這是一個壞主意,試圖打開URL那裏,彷彿它出錯它可能變得醜陋。

編輯2:

這將顯示在頁面中的所有鏈接:

import urlparse, urllib 
from BeautifulSoup import BeautifulSoup 

url = "http://www.example.com/index.html" 
source = urllib.urlopen(url).read() 

soup = BeautifulSoup(source) 

for item in soup.fetchall('a'): 
    try: 
     link = urlparse.urlparse(item['href'].lower()) 
    except: 
     # Not a valid link 
     pass 
    else: 
     print link 
+0

我同意,美麗的湯可能是更好的方式來處理這個問題。 – monkut 2008-11-13 00:44:28

6

下面是一個代碼示例,展示獲得鏈接的屬性和內容:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url)) 
for link in soup.findAll('a'): 
    print link.attrs, link.contents 
3

雖然我想其他可能是正確的,指出你使用美麗湯,他們可能不,並且使用一個外部庫可能會爲您的目的大規模過度。這是一個正則表達式,它可以完成你所要求的任務。

​​3210

下面是它匹配的是什麼:

'<a href="url" close="true">text</a>' 
// Parts: "url", "text" 

'<a href="url" close="true">text<span>something</span></a>' 
// Parts: "url", "text<span>something</span>" 

如果你想獲得只是的文本(例如:在上面的第二個例子「textsomething」),我只是運行另一個正則表達式了它去除尖括號之間的任何東西。

4

看起來你有兩個問題:

  1. link.content 小號,不link.content
  2. attrs是一個字典,而不是一個字符串。它包含HTML元素中每個屬性的鍵值對。鏈接。attrs ['href']會爲你提供你正在尋找的東西,但是如果你遇到沒有href屬性的標籤,你會希望在檢查中包裝它。