2014-09-17 5 views
3

SGMLParser를 상속받은 간단한 클래스를 작성했습니다. 이 클래스의 기본 아이디어는 html 페이지에서 모든 링크를 수집하고이 링크가있는 행 번호를 인쇄하는 것입니다.Python : SGMLParser가 줄 번호를 얻을 수 없습니다.

클래스는 다음과 같습니다

class HtmlParser(SGMLParser): 
    def reset(self): 
     SGMLParser.reset(self) 
     self.links = [] 

    def start_a(self, attr): 
     href = [v for k, v in attr if k == "href"] 
     self.links.append(href[0]) 
     print(self.getpos()) 

문제는 그 모든 링크에 getpos() 반환 (1,0). 다음 코드를 실행한다면 :

parser = HtmlParser() 
parser.feed(''' 
<!DOCTYPE html> 
    <html> 
     <head lang="en"> 
      <meta charset="UTF-8"> 
      <title></title> 
     </head> 
     <body> 
      <a href="www.foo-bar.com"></a> 
      <a href="http://foo.bar.com"></a> 
      <a href="www.google.com"></a> 
     </body> 
    </html>''') 
parser.close() 
print(parser.links) 

출력은 다음과 같습니다

(1, 0) 
(1, 0) 
(1, 0) 
['www.foo-bar.com', 'http://foo.bar.com', 'www.google.com'] 

질문 : 내가 링크의 실제 행 번호를 얻을 수 없습니다 왜?

답변

1

sgmllib is broken 때문에 줄 번호를 가져올 수 없습니다. 당신은 비슷한 방식으로 HTMLParser를 사용할 수있는 대안으로

는 :

(9, 12) 
(10, 12) 
(11, 12) 
['www.foo-bar.com', 'http://foo.bar.com', 'www.google.com'] 
:

from HTMLParser import HTMLParser 


class MyHTMLParser(HTMLParser): 
    def reset(self): 
     HTMLParser.reset(self) 
     self.links = [] 

    def handle_starttag(self, tag, attr): 
     if tag == 'a': 
      href = [v for k, v in attr if k == "href"] 
      self.links.append(href[0]) 
      print(self.getpos()) 

parser = MyHTMLParser() 
parser.feed(''' 
<!DOCTYPE html> 
    <html> 
     <head lang="en"> 
      <meta charset="UTF-8"> 
      <title></title> 
     </head> 
     <body> 
      <a href="www.foo-bar.com"></a> 
      <a href="http://foo.bar.com"></a> 
      <a href="www.google.com"></a> 
     </body> 
    </html>''') 
parser.close() 
print(parser.links) 

예상 출력한다