IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Python, помогите с кодом (
Шас'О Каис
сообщение 15.7.2009, 20:31
Сообщение #1





Группа: Пользователи
Регистрация: 9.2.2007
Пользователь №: 20 586



есть код:

import sgmllib, urllib, string, re, urlparse

global base_url
base_url = "http://uralweb.ru/"

class aFilter(sgmllib.SGMLParser):
def __init__(self):
sgmllib.SGMLParser.__init__(self) ; self.links = []

def start_a(self, atts):
atts = self._attdict(atts)
self.links.append( atts["href"] )

def _attdict(self, atts):
attdict = {}
for attname, attval in atts:
attdict[attname] = attval
return attdict

def parseLinks(base_url):
A = aFilter()
A.feed(urllib.urlopen(base_url).read())
return A.links

print parseLinks(base_url)


не могу понять что ему не нравиться, т.к если вбить вместо http://uralweb.ru/ например http://e1.ru/ то все нормально работает( т.е. как и задумано )

вот что пишет
Traceback (most recent call last):
File "***\start_a.py", line 26, in <module>
print parseLinks(base_url)
File "***\start_a.py", line 23, in parseLinks
A.feed(urllib.urlopen(base_url).read())
File "c:\Python25\lib\sgmllib.py", line 99, in feed
self.goahead(0)
File "c:\Python25\lib\sgmllib.py", line 133, in goahead
k = self.parse_starttag(i)
File "c:\Python25\lib\sgmllib.py", line 291, in parse_starttag
self.finish_starttag(tag, attrs)
File "c:\Python25\lib\sgmllib.py", line 340, in finish_starttag
self.handle_starttag(tag, method, attrs)
File "c:\Python25\lib\sgmllib.py", line 376, in handle_starttag
method(attrs)
File "***\start_a.py", line 13, in start_a
self.links.append( atts["href"] )
KeyError: 'href'

Сообщение отредактировал Шас'О Каис - 15.7.2009, 20:32
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Daemon_Hell
сообщение 15.7.2009, 20:59
Сообщение #2





Группа: Пользователи
Регистрация: 30.5.2006
Пользователь №: 12 355



В коде страницы на уралвебе встречается
Код
<a name="top"></a>

В данном случае словарь atts не будет содержать ключа href.
Исправленный код:
Код
import sgmllib, urllib, string, re, urlparse

global base_url
base_url = "http://uralweb.ru/"

class aFilter(sgmllib.SGMLParser):
    def __init__(self):
        sgmllib.SGMLParser.__init__(self); self.links = []

    def start_a(self, atts):
        atts = self._attdict(atts)
        try:
            self.links.append( atts["href"] )
        except KeyError:
            pass
    def _attdict(self, atts):
        attdict = {}
        for attname, attval in atts:
            attdict[attname] = attval
        return attdict

def parseLinks(base_url):
    A = aFilter()
    A.feed(urllib.urlopen(base_url).read())
    return A.links

print parseLinks(base_url)

На будущее - пользуйтесь тэгом code, чтобы форматирование не съезжало.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Шас'О Каис
сообщение 15.7.2009, 21:21
Сообщение #3





Группа: Пользователи
Регистрация: 9.2.2007
Пользователь №: 20 586



спасибо за подсказку blush.gif (я обработку исключений еще не читал)
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Шас'О Каис
сообщение 15.7.2009, 22:37
Сообщение #4





Группа: Пользователи
Регистрация: 9.2.2007
Пользователь №: 20 586



а теперь вот так ругается (
Код
import sgmllib
import urllib
import urlparse
from urlparse import *
from httplib import HTTPConnection

global links404
global links_passed
links404 = []
links_passed = []

class aFilter(sgmllib.SGMLParser):
  def __init__(self, base_url):
    sgmllib.SGMLParser.__init__(self)
    self.base_url = base_url
    self.feed(urllib.urlopen(base_url).read())
    
  def start_a(self, atts):
    atts = self._attdict(atts)
    try:
        if urlparse( atts["href"] )[0] != "mailto":
            if urlparse( atts["href"] )[0] == "":
                atts["href"] = urljoin(self.base_url, atts["href"])
        
            if links_passed.count( atts["href"] ) == 0:
                conn = HTTPConnection(urlparse(atts["href"])[1])
                conn.putrequest("GET", urlparse(atts["href"])[2])
                conn.endheaders()
                resp = conn.getresponse()
              
                if resp.status == 404:
                    links404.append( atts["href"] )
                else:
                    if atts["href"] != self.base_url:
                        if urlparse(atts["href"])[1] == urlparse(self.base_url)[1]:
                            links_passed.append( atts["href"] )
                        #aFilter(atts["href"])
    except KeyError:
        pass

  def _attdict(self, atts):
    attdict = {}
    for attname, attval in atts:
      attdict[attname] = attval
    return attdict

aFilter("http://www.uralweb.ru/")
print links_passed


Traceback (most recent call last):
File "***\start_a.py", line 48, in <module>
aFilter("http://www.uralweb.ru/")
File "***\start_a.py", line 17, in __init__
self.feed(urllib.urlopen(base_url).read())
File "c:\Python25\lib\sgmllib.py", line 99, in feed
self.goahead(0)
File "c:\Python25\lib\sgmllib.py", line 133, in goahead
k = self.parse_starttag(i)
File "c:\Python25\lib\sgmllib.py", line 291, in parse_starttag
self.finish_starttag(tag, attrs)
File "c:\Python25\lib\sgmllib.py", line 340, in finish_starttag
self.handle_starttag(tag, method, attrs)
File "c:\Python25\lib\sgmllib.py", line 376, in handle_starttag
method(attrs)
File "***\start_a.py", line 29, in start_a
conn.endheaders()
File "c:\Python25\lib\httplib.py", line 860, in endheaders
self._send_output()
File "c:\Python25\lib\httplib.py", line 732, in _send_output
self.send(msg)
File "c:\Python25\lib\httplib.py", line 699, in send
self.connect()
File "c:\Python25\lib\httplib.py", line 683, in connect
raise socket.error, msg
socket.error: (10061, 'Connection refused')



с тем же http://e1.ru - проблем нет

Сообщение отредактировал Шас'О Каис - 15.7.2009, 22:39
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Daemon_Hell
сообщение 15.7.2009, 23:23
Сообщение #5





Группа: Пользователи
Регистрация: 30.5.2006
Пользователь №: 12 355



Цитата(Шас @ 15.7.2009, 23:37) *
а теперь вот так ругается (
Код
код


Traceback (most recent call last):
raise socket.error, msg
socket.error: (10061, 'Connection refused')



с тем же http://e1.ru - проблем нет

Ну тут все просто - какой-то хост отвергает соединение. Это исключение тоже нужно обрабатывать. У меня оно еще ругается на жаваскриптовые линки smile.gif
Просто убери KeyError.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 22.9.2019, 19:36
Блог КАБiNET