2012-10-14 48 views
3

我解析一個完整的HTML文件,提取某些URL使用Python Beautifulsoup模塊,這種和平的代碼:僅獲得一個網址列表的第一個環節與BeautifulSoup

for link in soup.find_all('a'): 
    for line in link : 
     if "condition" in line : 

      print link.get("href") 

我在殼得到一系列的觀察條件的,如果循環鏈接:

  • 的http:// ..link1
  • 的http:// ..link2
  • 的http:// ..linkn

我怎麼可以把一個變量「輸出」僅此列表的第一個環節?

編輯:

的網頁是:http://download.cyanogenmod.com/?device=p970,腳本必須返回第一個短網址:在HTML頁面(HTTP //get.cm/...)。

+0

鏈接循環解析HTML頁面中的所有字符串,線循環再次流動if cicle中的cicle檢查條件,因此它僅打印觀察條件的URL –

回答

5

您可以用oneliner做到這一點:

import re 

soup.find('a', href=re.compile('^http://get.cm/get'))['href'] 

將其分配給一個變量只是:

variable=soup.find('a', href=re.compile('^http://get.cm/get'))['href'] 

我不知道到底是什麼,你這樣做,我將發佈完整的代碼從頭開始: NB!如果您使用bs4更改進口

import urllib2 
from BeautifulSoup import BeautifulSoup 
import re 

request = urllib2.Request("http://download.cyanogenmod.com/?device=p970") 
response = urllib2.urlopen(request) 
soup = BeautifulSoup(response) 
variable=soup.find('a', href=re.compile('^http://get.cm/get'))['href'] 
print variable 

>>> 
http://get.cm/get/4jj 
+0

我嘗試關閉帶有break和assign的cicle鏈接到循環中的變量,但此時shell不打印任何內容。 –

+0

是的,使用'break'與cicle結束後'打印output' –

+0

不,它給了我一個縮進錯誤的,如果cicle –

1

您可以在沒有循環的BeautifulSoup中更容易,更清楚地做到這一點。

假設你解析BeautifulSoup對象被命名爲soup

output = soup.find(lambda tag: tag.name=='a' and "condition" in tag).attrs['href'] 
print output 

注意,find方法只返回的第一個結果,而find_all回報他們。

+0

這個解決方案給我這個錯誤:'AttributeError的:「NoneType」對象有沒有屬性「attrs'' –

+0

那是因爲你沒有正確執行'lambda'。我爲你寫的是一個樣本,在標籤中使用了明顯不正確的「條件」。你得到的'AttributeError'因爲'soup.find'沒有找到爲其'lambda'返回TRUE,所以那麼你嘗試調用''上None' attrs'任何對象。如果你給了你最初提取的網站,我將能夠提供更好的答案。 – jdotjdot

相關問題