Tôi có một lớp như thế này, tạo ra các siêu liên kết:
class getLink[obj]:
def __init__[self, text, url]:
self.text = self.Argument[text]
self.url = self.Argument[url]
def render[self, context]:
return "%s %s" % [html.link[self.text[context], self.url[context]]]
def link[text, url]:
return mark_safe['%s' % [url, title]]
Sau đó để có được một liên kết tôi làm như vậy:
getLink[text=_['Test'],fn.getUrl[]]
Kết quả HTML:
Test
Tôi muốn quấn liên kết bên trong
getLink[text=_['Test'],fn.getUrl[]]
6 và một liên kết khác bên trong thẻ getLink[text=_['Test'],fn.getUrl[]]
7. Tôi đã cố gắng thêm các thẻ trực tiếp trong getLink[text=_['Test'],fn.getUrl[]]
8 nhưng không hoạt động getLink[text=_['Test'],fn.getUrl[]]
9. Tôi là người mới ở Python rất xin lỗi nếu tôi sai.Cảm ơn bạn đã giúp đỡ!
Test 0 đóng vai trò là cơ sở để phân tích các tệp văn bản được định dạng bằng HTML [Ngôn ngữ đánh dấu siêu văn bản] và XHTML.
Lớp ________ 21 ________ 22 [*, convert_charrefs = true] ¶[*, convert_charrefs=True]¶Tạo một thể hiện phân tích cú pháp có thể phân tích đánh dấu không hợp lệ.
Nếu convert_charrefs là
Test
3 [mặc định], tất cả các tham chiếu ký tự [ngoại trừ các tài liệu trong ____ 24/________ 25] sẽ tự động chuyển đổi thành các ký tự Unicode tương ứng.Một ví dụ
Test
0 được cho dữ liệu HTML và các phương thức xử lý gọi khi các thẻ bắt đầu, thẻ kết thúc, văn bản, nhận xét và các yếu tố đánh dấu khác gặp phải. Người dùng nên phân lớp Test
0 và ghi đè các phương thức của mình để thực hiện hành vi mong muốn.Trình phân tích cú pháp này không kiểm tra xem các thẻ kết thúc có khớp thẻ bắt đầu hay gọi trình xử lý thẻ cuối cho các phần tử được đóng hoàn toàn bằng cách đóng một phần tử bên ngoài.
Đã thay đổi trong phiên bản 3.4: Convert_charrefs đối số từ khóa được thêm vào.convert_charrefs keyword argument added.
Đã thay đổi trong phiên bản 3.5: Giá trị mặc định cho đối số Convert_charrefs hiện là
3.The default value for argument convert_charrefs is now Test
Test
3.Ví dụ Ứng dụng phân tích cú pháp HTML
Ví dụ cơ bản, dưới đây là trình phân tích cú pháp HTML đơn giản sử dụng lớp
Test
0 để in ra thẻ bắt đầu, thẻ cuối và dữ liệu khi chúng gặp phải:from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' 'Parse me!
']
Đầu ra sau đó sẽ là:
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html
Test
0 Phương pháp ¶
Test
Test
0 Các trường hợp có các phương pháp sau: ________ 32 ________ 33 [dữ liệu] ¶[data]¶Cho ăn một số văn bản cho trình phân tích cú pháp. Nó được xử lý trong chừng mực vì nó bao gồm các yếu tố hoàn chỉnh; Dữ liệu không đầy đủ được đệm cho đến khi có nhiều dữ liệu được cung cấp hoặc
def add_tags[tag, word]:
return "%s" % [tag, word, tag]
print[add_tags['i', 'Python']]
print[add_tags['b', 'Python Tutorial']]
4 được gọi. Dữ liệu phải là def add_tags[tag, word]:
return "%s" % [tag, word, tag]
print[add_tags['i', 'Python']]
print[add_tags['b', 'Python Tutorial']]
5. ________ 32 ________ 37 [][]¶Xử lý lực của tất cả dữ liệu được đệm như thể nó được theo sau bởi một dấu cuối cùng. Phương pháp này có thể được xác định lại bởi một lớp dẫn xuất để xác định xử lý bổ sung ở cuối đầu vào, nhưng phiên bản được xác định lại phải luôn gọi phương thức lớp cơ sở
Test
0 def add_tags[tag, word]:
return "%s" % [tag, word, tag]
print[add_tags['i', 'Python']]
print[add_tags['b', 'Python Tutorial']]
4. ________ 32 ________ 41 [][]¶Đặt lại trường hợp. Mất tất cả dữ liệu chưa qua xử lý. Điều này được gọi là ngầm vào thời điểm khởi tạo.
________ 32 ________ 43 [][]¶Trả về số dòng hiện tại và bù.
________ 32 ________ 45 [][]¶Trả về văn bản của thẻ bắt đầu được mở gần đây nhất. Điều này thường không cần thiết để xử lý có cấu trúc, nhưng có thể hữu ích trong việc xử lý HTML, khi được triển khai hoặc để tạo lại đầu vào với những thay đổi tối thiểu [có thể bảo tồn được khoảng trắng giữa các thuộc tính, v.v.].
Các phương pháp sau được gọi là khi các phần tử dữ liệu hoặc đánh dấu gặp phải và chúng có nghĩa là được ghi đè trong một lớp con. Việc triển khai lớp cơ sở không làm gì cả [ngoại trừ
Python Python Tutorial6]: ________ 32 ________ 48 [Tag, attrs] ¶[tag, attrs]¶
Phương thức này được gọi để xử lý thẻ bắt đầu của một phần tử [ví dụ:
Python Python Tutorial9].
Đối số thẻ là tên của thẻ được chuyển đổi thành chữ thường. Đối số attrs là danh sách các cặp
i = 5 while i > 1: print["Whil-ing away!"] i -= 1 if i == 3: break else: print["Finished up!"]0 chứa các thuộc tính được tìm thấy bên trong dấu ngoặc của thẻ ____ ____51. Tên sẽ được dịch thành chữ thường và trích dẫn trong giá trị đã được xóa, và các tài liệu tham khảo ký tự và thực thể đã được thay thế.
Chẳng hạn, đối với thẻ
i = 5 while i > 1: print["Whil-ing away!"] i -= 1 if i == 3: break else: print["Finished up!"]2, phương pháp này sẽ được gọi là
i = 5 while i > 1: print["Whil-ing away!"] i -= 1 if i == 3: break else: print["Finished up!"]3.
Tất cả các tham chiếu thực thể từ
i = 5 while i > 1: print["Whil-ing away!"] i -= 1 if i == 3: break else: print["Finished up!"]4 được thay thế trong các giá trị thuộc tính. ________ 32 ________ 56 [TAG] ¶[tag]¶
Phương thức này được gọi để xử lý thẻ cuối của một phần tử [ví dụ:
i = 5 while i > 1: print["Whil-ing away!"] i -= 1 if i == 3: break else: print["Finished up!"]7].
Đối số thẻ là tên của thẻ được chuyển đổi thành chữ thường.
Tương tự như
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '0, nhưng được gọi khi trình phân tích cú pháp gặp một thẻ trống kiểu XHTML [Parse me!
']
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '1]. Phương pháp này có thể được ghi đè bởi các lớp con yêu cầu thông tin từ vựng cụ thể này; Việc triển khai mặc định chỉ đơn giản gọiParse me!
']
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '0 vàParse me!
']
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '3. ________ 32 ________ 65 [dữ liệu] ¶[data]¶Parse me!
']
Phương pháp này được gọi để xử lý dữ liệu tùy ý [ví dụ: các nút văn bản và nội dung của
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '6 vàParse me!
']
from html.parser import HTMLParser class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Encountered a start tag:", tag] def handle_endtag[self, tag]: print["Encountered an end tag :", tag] def handle_data[self, data]: print["Encountered some data :", data] parser = MyHTMLParser[] parser.feed['Test' '7]. ________ 32 ________ 69 [tên] ¶[name]¶Parse me!
']
Phương pháp này được gọi để xử lý một tham chiếu ký tự được đặt tên của Mẫu
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html0 [ví dụ:
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html1], trong đó tên là tham chiếu thực thể chung [ví dụ:
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html2]. Phương pháp này không bao giờ được gọi là nếu convert_charrefs là
Test
3. ________ 32 ________ 75 [tên] ¶[name]¶Phương pháp này được gọi là xử lý các tham chiếu ký tự số thập phân và thập lục phân của mẫu
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html6 và
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html7. Ví dụ, tương đương thập phân cho
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html1 là
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html9, trong khi thập lục phân là
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]0; Trong trường hợp này, phương thức sẽ nhận được
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]1 hoặc
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]2. Phương pháp này không bao giờ được gọi là nếu convert_charrefs là
Test
3. ________ 32 ________ 85 [dữ liệu] ¶[data]¶Phương pháp này được gọi là khi gặp bình luận [ví dụ:
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]6].
Ví dụ: nhận xét
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]7 sẽ khiến phương thức này được gọi với đối số
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]8.
Nội dung của Internet Explorer Nhận xét có điều kiện [Condcoms] cũng sẽ được gửi đến phương thức này, vì vậy, đối với
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]9, phương thức này sẽ nhận được
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"0. ________ 32 ________ 92 [tuyên bố] ¶[decl]¶
Phương pháp này được gọi để xử lý khai báo HTML DocType [ví dụ:
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"3].
Tham số DEC sẽ là toàn bộ nội dung của khai báo bên trong đánh dấu
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"4 [ví dụ:
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"5]. ________ 32 ________ 97 [dữ liệu] ¶[data]¶
Phương thức được gọi khi gặp phải hướng dẫn xử lý. Tham số dữ liệu sẽ chứa toàn bộ hướng dẫn xử lý. Ví dụ: đối với hướng dẫn xử lý
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"8, phương pháp này sẽ được gọi là
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"9. Nó được dự định sẽ được ghi đè bởi một lớp dẫn xuất; Việc thực hiện lớp cơ sở không làm gì cả.
Ghi chú
Lớp
Test
0 sử dụng các quy tắc cú pháp SGML để xử lý hướng dẫn. Một hướng dẫn xử lý XHTML bằng cách sử dụng Trailing getLink[text=_['Test'],fn.getUrl[]]
01 sẽ khiến getLink[text=_['Test'],fn.getUrl[]]
01 được đưa vào dữ liệu. ________ 32 ________ 104 [dữ liệu] ¶[data]¶Phương pháp này được gọi là khi một tuyên bố không được công nhận được đọc bởi trình phân tích cú pháp.
Tham số dữ liệu sẽ là toàn bộ nội dung của khai báo bên trong đánh dấu ____105. Đôi khi rất hữu ích khi được ghi đè bởi một lớp dẫn xuất. Việc thực hiện lớp cơ sở không làm gì cả.
Ví dụ;
Lớp sau đây thực hiện trình phân tích cú pháp sẽ được sử dụng để minh họa thêm các ví dụ:
from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser[HTMLParser]: def handle_starttag[self, tag, attrs]: print["Start tag:", tag] for attr in attrs: print[" attr:", attr] def handle_endtag[self, tag]: print["End tag :", tag] def handle_data[self, data]: print["Data :", data] def handle_comment[self, data]: print["Comment :", data] def handle_entityref[self, name]: c = chr[name2codepoint[name]] print["Named ent:", c] def handle_charref[self, name]: if name.startswith['x']: c = chr[int[name[1:], 16]] else: c = chr[int[name]] print["Num ent :", c] def handle_decl[self, data]: print["Decl :", data] parser = MyHTMLParser[]
Phân tích cú pháp do DocType:
>>> parser.feed[''] Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"
Phân tích một phần tử với một vài thuộc tính và một tiêu đề:
getLink[text=_['Test'],fn.getUrl[]]
0Nội dung của các yếu tố
Test
4 và Test
5 được trả về, mà không cần phân tích cú pháp thêm:getLink[text=_['Test'],fn.getUrl[]]
1Nhận xét phân tích cú pháp:
getLink[text=_['Test'],fn.getUrl[]]
2Phân tích phân tích các tham chiếu ký tự được đặt tên và số và chuyển đổi chúng sang chính xác [lưu ý: 3 tài liệu tham khảo này đều tương đương với
getLink[text=_['Test'],fn.getUrl[]]
08]:getLink[text=_['Test'],fn.getUrl[]]
3Cho ăn các khối không đầy đủ cho
getLink[text=_['Test'],fn.getUrl[]]
09 hoạt động, nhưng getLink[text=_['Test'],fn.getUrl[]]
10 có thể được gọi nhiều lần [trừ khi convert_charrefs được đặt thành Test
3]:getLink[text=_['Test'],fn.getUrl[]]
4Phân tích cú pháp HTML không hợp lệ [ví dụ: các thuộc tính chưa được trích xuất] cũng hoạt động:
getLink[text=_['Test'],fn.getUrl[]]
5