2012-02-01 39 views
5

Tôi đã được cung cấp một url và tôi muốn trích xuất nội dung của thẻ <BODY> từ url. Tôi đang sử dụng Python3. Tôi đã xem qua sgmllib nhưng không có sẵn cho Python3.Phân tích cú pháp thẻ html bằng Python

Ai đó có thể vui lòng hướng dẫn tôi về điều này không? Tôi có thể sử dụng HTMLParser cho việc này không?

Đây là những gì tôi đã cố gắng:

import urllib.request 
f=urllib.request.urlopen("URL") 
s=f.read() 

from html.parser import HTMLParser 
class MyHTMLParser(HTMLParser): 
    def handle_data(self, data): 
     print("Encountered some data:", data) 

parser = MyHTMLParser() 
parser.feed(s) 

này mang lại cho tôi lỗi: Lỗi Loại: Không thể chuyển đổi đối tượng 'byte' để str ngầm

+8

"hãy hướng dẫn tôi": Sẽ thực hiện. Tìm kiếm. Nó đã được hỏi. Rất rất nhiều lần. Sau khi bạn thực hiện tìm kiếm (ở góc trên bên phải), hãy hỏi ** các câu hỏi ** cụ thể dựa trên các câu trả lời đã được đưa ra. –

+0

để cụ thể, chúng tôi có thể phân tích cú pháp url trong phương thức parser.feed() không? – Nerd

+0

@ghbhatt: cho chúng tôi xem ví dụ về những gì bạn cần. Nếu không nhìn thấy câu trả lời của tôi là những gì bạn đang yêu cầu. – RanRag

Trả lời

10

Để khắc phục sự thay đổi TypeError dòng # 3 đến

s = str (f.read())

Các trang web mà bạn đang nhận được trở lại dưới dạng byte, và bạn cần để thay đổi các byte thành một chuỗi để cung cấp chúng cho trình phân tích cú pháp.

+0

+1 cho câu trả lời đúng. – RanRag

+1

Bạn nên tìm mã hóa từ tiêu đề HTTP để biết mã hóa nào sẽ sử dụng. –

4

Nếu bạn có một cái nhìn tại s bạn loại biến của nó là byte.

>>> type(s) 
<class 'bytes'> 

và nếu bạn có một cái nhìn tại Parser.feed nó đòi hỏi một chuỗi hoặc unicode như một argument.So, làm

>>> x = s.decode('utf-8') 
>>> type(x) 
<class 'str'> 
>>> parser.feed(x) 

hoặc làm x = str(s).

+1

Có vẻ như chúng tôi đã đưa ra câu trả lời giống nhau trong một phút của nhau. – pycoder112358

+0

Bạn nên tìm mã hóa từ tiêu đề HTTP để biết mã hóa nào sẽ sử dụng. –

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