2017-01-17 53 views
1

我正在測試美麗的湯網絡報廢工具。下面的代碼只是連接到一個subreddit並嘗試打印第一頁上來自用戶帖子的所有圖像的鏈接。Python 2.7 - 美麗的湯網Web報廢find_all命令不起作用

import requests 
from bs4 import BeautifulSoup 

url = "https://www.reddit.com/r/pics" 
r = requests.get(url) 

if r.status_code != 200: 
    print "failed to connect" 
    exit() 

sourcecode = r.text 
soup = BeautifulSoup(sourcecode, "html.parser") 

print soup 

for tag in soup.find_all('a', {'class': 'title may-blank outbound srTagged'}): 
    print "entered into for loop" 

    if tag['href'].startswith('http'): 
     print tag['href'] 

此代碼會導致正確打印soup對象,我可以看到它。但是,soup.find_all('a', {'class':'title may-blank outbound srTagged'})命令返回一個空列表。沒有錯誤,只有一個空列表,意味着最後的for-loop甚至不能運行。

我想知道這裏有什麼問題。我已經複製並粘貼了字符串,我可以看到我試圖在網頁源代碼1上打印的鏈接。

我指的是行:

<a class = "title may-blank outbound srTagged" ... 

這我複製並粘貼到我的代碼,以避免拼寫錯誤,仍然沒有任何反應...任何想法,爲什麼命令返回一個空列表?

我已將for循環更改爲for tag in soup.find_all('a', {'class': 'thumbnail may-blank outbound'}):,這是另一個類名,它的行爲正常。

該網站只是阻止美麗的湯訪問源代碼的部分?

+0

你想鏈接引用的reddit線程,或者引用的圖像的外部位置? – wpercy

+0

我正在尋找鏈接到圖像的外部位置(i.dailymail.co.uk ....等)。這個想法本來是要在reddit頁面上列出所有的圖像鏈接,然後通過一個單獨的函數來傳遞它們,它可以簡單地從鏈接列表中下載所有應該從上面的代碼輸出的鏈接的圖像。 – tdeoliveira05

回答

0

首先,您遇到differences between parsers,切換到一個更寬鬆的html5lib

soup = BeautifulSoup(sourcecode, "html5lib") 

這需要安裝html5lib

此外,您還可以簡化您的定位聯繫方式:

  • 使用CSS selectors和檢查titleoutbound類只
  • 不檢查href值與http因爲outbound類開始隱式地定義它

修正版本:

for tag in soup.select('a.title.outbound'): 
    print(tag['href']) 
+0

This非常感謝 - 仍然學習基礎知識,以便提高效率的任何提示幫助! – tdeoliveira05

0

html.parser在Python2打破,BeautifulSoup Document提到:

如果可以的話,我建議你安裝和使用lxml速度。如果 您使用的是早於2.7.3的Python 2版本或早於3.2.2的版本 Python 3,則必須安裝lxmlhtml5libPython的內置HTML解析器並不是很完美好在 舊版本。

請注意,如果文檔無效,不同的解析器將爲它生成不同的美麗的湯樹。有關詳細信息,請參見Differences between parsers

+0

不知道,謝謝! – tdeoliveira05