2011-01-12 3 views
2

Привет, ребята, Я написал какой-то глупый код для обучения, но он не работает ни на одном сайте. вот код:Как получить значки с помощью красивого супа и питона

import urllib2, re 
from BeautifulSoup import BeautifulSoup as Soup 

class Founder: 
    def Find_all_links(self, url): 
     page_source = urllib2.urlopen(url) 
     a = page_source.read() 
     soup = Soup(a) 

     a = soup.findAll(href=re.compile(r'/.a\w+')) 
     return a 
    def Find_shortcut_icon (self, url): 
     a = self.Find_all_links(url) 
     b = '' 
     for i in a: 
      strre=re.compile('shortcut icon', re.IGNORECASE) 
      m=strre.search(str(i)) 
      if m: 
       b = i["href"] 
     return b 
    def Save_icon(self, url): 
     url = self.Find_shortcut_icon(url) 
     print url 
     host = re.search(r'[0-9a-zA-Z]{1,20}\.[a-zA-Z]{2,4}', url).group() 
     opener = urllib2.build_opener() 
     icon = opener.open(url).read() 
     file = open(host+'.ico', "wb") 
     file.write(icon) 
     file.close() 
     print '%s icon succsefully saved' % host 
c = Founder() 
print c.Save_icon('http://lala.ru') 

Самое странное, что он работает на сайте: http://habrahabr.ru http://5pd.ru

Но не работает для большинства других, которые я проверил , P.S. Я знаю, что код отстой, пожалуйста, дайте мне несколько советов.

Спасибо

+1

Вы можете получить доступ к фавиконки большинства сайтов просто запросив http://example.com/favicon.ico – miku

+0

Thats работы HTML-сайтов, но doens't работа для CMS например wordpress: http://5pd.ru/wp-content/uploads/2010/11/favicon.ico – kurd

+2

Не ругайте с регулярными выражениями. 'soup.find (« link », rel =« ярлык »)' работает (проверено на 5pd.ru). –

ответ

9

Вы делаете это намного сложнее, чем это должно быть. Вот простой способ сделать это:

import urllib 
page = urllib.urlopen("http://5pd.ru/") 
soup = BeautifulSoup(page) 
icon_link = soup.find("link", rel="shortcut icon") 
icon = urllib.urlopen(icon_link['href']) 
with open("test.ico", "wb") as f: 
    f.write(icon.read()) 
+0

BeautifulSoup чувствителен к регистру, поэтому это не будет работать, если на странице есть «Ярлык» или «КОРОТКАЯ ИКОНА» вместо «ярлыка». –

0

Спасибо, Томас. Вот код Wiith некоторые изменения:

import urllib2 
from BeautifulSoup import BeautifulSoup 

page = urllib2.urlopen("http://5pd.ru/") 
soup = BeautifulSoup(page.read()) 
icon_link = soup.find("link", rel="shortcut icon") 
icon = urllib2.urlopen(icon_link['href']) 
with open("test.ico", "wb") as f: 
    f.write(icon.read()) 
0

Спасибо, курд. Вот код, с некоторыми изменениями:

import urllib2 
from BeautifulSoup import BeautifulSoup 

url = "http://www.facebook.com" 
page = urllib2.urlopen(url) 
soup = BeautifulSoup(page.read()) 
icon_link = soup.find("link", rel="shortcut icon") 
try: 
    icon = urllib2.urlopen(icon_link['href']) 
except: 
    icon = urllib2.urlopen(url + icon_link['href']) 
iconname = url.split(r'/') 
iconname = iconname[2].split('.') 
iconname = iconname[1] + '.' + iconname[2] + '.ico' 
with open(iconname, "wb") as f: 
    f.write(icon.read()) 
Смежные вопросы