2012-06-16 27 views
12

Tôi đã sử dụng Trình phân tích cú pháp HTML để loại bỏ dữ liệu khỏi các trang web và loại bỏ mã html khi làm như vậy. Tôi biết các mô-đun khác nhau như Beautiful Soup, nhưng quyết định đi theo con đường không phụ thuộc vào mô-đun "bên ngoài". Có một mã được cung cấp bởi Eloff: Strip HTML from strings in PythonSử dụng HTMLParser bằng Python 3.2

from HTMLParser import HTMLParser 

class MLStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

Nó hoạt động trong Python 3.1. Tuy nhiên, gần đây tôi đã nâng cấp lên Python 3.2.x và thấy rằng tôi gặp lỗi liên quan đến mã HTML Parser như được viết ở trên.

điểm lỗi đầu tiên của tôi vào dòng:

s.feed(html) 

... và các lỗi nói ...

AttributeError: 'MLStripper' object has no attribute 'strict' 

Vì vậy, sau một chút về nghiên cứu, tôi thêm "nghiêm ngặt = True "vào dòng trên cùng, làm cho nó ...

class MLStripper(HTMLParser, strict=True) 

Tuy nhiên, tôi nhận được lỗi mới:

TypeError: type() takes 1 or 3 arguments 

Để xem những gì sẽ xảy ra, tôi loại bỏ các "tự" tranh luận và để lại trong "nghiêm ngặt = True" ... mà đã từ bỏ các lỗi:

NameError: global name 'self' is not defined 

... và tôi đã nhận cảm giác "Tôi đoán đoán".

Tôi không biết đối số thứ ba trong dòng class MLStripper(HTMLParser) là sau selfstrict=True; nghiên cứu không quăng bất kỳ chứng ngộ nào.

Trả lời

20

Bạn đang phân lớp HTMLParser, nhưng bạn không gọi phương thức __init__ của nó. Bạn cần phải thêm một dòng vào phương pháp __init__ của bạn:

def __init__(self): 
    super().__init__() 
    self.reset() 
    self.fed = [] 

Ngoài ra, đối Python 3, dòng nhập khẩu là:

from html.parser import HTMLParser 

Với những thay đổi này, một ví dụ đơn giản hoạt động. Không thay đổi dòng class, điều đó không liên quan.

+2

Điều đó hoạt động hoàn hảo, Thomas K. Cảm ơn bạn rất nhiều! Các tập lệnh đang hoạt động hoàn hảo một lần nữa với mã "super() .__ init __()" được chèn vào. – MilesNielsen

+0

Điều này cũng giải quyết được đối tượng AttributeError: 'HTMLTagRemover' không có thuộc tính 'convert_charrefs' super() .__ init __() KHÔNG được yêu cầu trong Python2 cho tôi nhưng được viết bằng Python3 - cảm ơn –

Các vấn đề liên quan