2010-08-25 48 views
19

我很抱歉不得不問這樣的事情,但是Python的機械化文件似乎真的缺乏和我可能不知道這一點。他們只舉一個例子,我可以找到以下鏈接:Python的機械化,跟隨鏈接的網址和什麼是NR參數?

response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1) 

但我不想使用正則表達式,我只想跟隨一個基於它的url的鏈接,我將如何做到這一點..還有什麼是「nr」有時用於以下鏈接?

感謝任何信息

+0

剛剛意識到我的頭文件中可能有錯誤,導致連接無法正常工作..感謝幫助過的人,我認爲您的答案將對我有用,並且我找到了另一種更直接的方法它在另一個網站上一旦完成,我將在這裏發佈,以供參考 – Rick 2010-08-25 20:51:14

回答

49

br.follow_link需要Link對象或關鍵字arg(如nr=0)。

br.links()列出了所有的鏈接。

br.links(url_regex='...')列出了所有的URL與正則表達式匹配的鏈接。

br.links(text_regex='...')列出了鏈接文本與正則表達式匹配的所有鏈接。

br.follow_link(nr=num)如下爲0頁面上的num條鏈接,以開始計數,它返回響應對象(同種什麼br.open(...)返回)

br.find_link(url='...')返回Link對象,其url完全等於給定的網址。

br.find_linkbr.links,br.follow_link,br.click_link全部接受相同的關鍵字。運行help(br.find_link)查看關於這些關鍵字的文檔。

編輯:如果你有,你想跟蹤目標網址,你可以做這樣的事情:

import mechanize 
br = mechanize.Browser() 
response=br.open("http://www.example.com/") 
target_url='http://www.rfc-editor.org/rfc/rfc2606.txt' 
for link in br.links(): 
    print(link) 
    # Link(base_url='http://www.example.com/', url='http://www.rfc-editor.org/rfc/rfc2606.txt', text='RFC 2606', tag='a', attrs=[('href', 'http://www.rfc-editor.org/rfc/rfc2606.txt')]) 
    print(link.url) 
    # http://www.rfc-editor.org/rfc/rfc2606.txt 
    if link.url == target_url: 
     print('match found') 
     # match found    
     break 

br.follow_link(link) # link still holds the last value it had in the loop 
print(br.geturl()) 
# http://www.rfc-editor.org/rfc/rfc2606.txt 
+0

@Rick:如果你通過'br.links()'循環,你可以看看字符串'link.url'來判斷你是否遵循它。不需要正則表達式。 – unutbu 2010-08-25 20:25:26

+0

謝謝,我想我現在得到它......我不知道它是什麼,但我有(最新的版本)似乎沒有太多的doc文件中的蟒蛇機甲的版本,不知道爲什麼..無論如何,感謝您的幫助,我想我可以得到它基於你說什麼,將嘗試 – Rick 2010-08-25 20:30:56

+1

我仍然無法弄清楚如何獲得一個鏈接匹配,我試圖使用正則表達式作爲完整的url,但它的沒有給出匹配(當我做for循環時,它永遠不會進入循環,意味着它沒有得到任何匹配) – Rick 2010-08-25 20:37:16

2

從看代碼,我懷疑你想

response1 = br.follow_link(link=LinkObjectToFollow) 

NR是相同的find_link號召下的記錄。

編輯:在我第一次粗略的一瞥,我沒有意識到「鏈接」不是一個簡單的鏈接。

+0

我在代碼本身中找到了'nr'信息。 _mechanize.py在findtext的doctext中...右邊第614行 – jkerian 2010-08-25 19:57:49

+0

哦,對,我甚至沒有想過他們會有一個不同於在線版本的doc文件,因爲我已經習慣了它也在線上,謝謝提示 – Rick 2010-08-25 20:16:42

16

我發現這種方式做到這一點,以供參考的人誰不要使用正則表達式:

r = br.open("http://www.somewebsite.com") 
br.find_link(url='http://www.somewebsite.com/link1.html') 
req = br.click_link(url='http://www.somewebsite.com/link1.html') 
br.open(req) 
print br.response().read() 

或者,它會被鏈接的文本也行:

r = br.open("http://www.somewebsite.com") 
br.find_link(text='Click this link') 
req = br.click_link(text='Click this link') 
br.open(req) 
print br.response().read() 
+2

我喜歡這個解決方案比我建議的更好。 (我認爲它甚至可以在沒有調用br.find_link的情況下工作)。請接受這個,所以它會泡到頂端。 – unutbu 2010-08-26 12:16:05

2

nr用於您關注的鏈接。 如果你的文本或url已經被正則表達式超過一個。 默認爲所以如果你使用默認你將遵循鏈接第一個正則表達式。 例如 來源:

<a href="link.html>Click this link</a> 
<a href="link2.html>Click this link</a> 
在這個例子中,我們需要遵循「單擊此鏈接」文本

,但我們選擇link2.html遵循準確

br.click_link(text='Click this link', nr=1) 

通過它,你會得到鏈接2。 html回覆