Mercurial > cpython-lru_cache-weakref
annotate Lib/html/parser.py @ 87081:dc5ae99bc605
Issue #19437: Fix GetKeepedObjects() of ctypes, handle PyCData_GetContainer()
failure
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Wed, 13 Nov 2013 13:24:50 +0100 |
| parents | 7d8a37020db9 |
| children | 7b9235852b3b |
| rev | line source |
|---|---|
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
1 """A parser for HTML and XHTML.""" |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 # This file is based on sgmllib.py, but the API is slightly different. |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 # XXX There should be a way to distinguish between PCDATA (parsed |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 # character data -- the normal case), RCDATA (replaceable character |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 # data -- only char and entity references and end tags are special) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 # and CDATA (character data -- only end tags are special). |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
44212
c6fb393b6c81
rename markupbase to _markupbase
Fred Drake <fdrake@acm.org>
parents:
41585
diff
changeset
|
11 import _markupbase |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 import re |
|
77630
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
13 import warnings |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 |
|
83581
1f7ce8af3356
#14679: add an __all__ (that contains only HTMLParser) to html.parser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77742
diff
changeset
|
15 __all__ = ['HTMLParser'] |
|
1f7ce8af3356
#14679: add an __all__ (that contains only HTMLParser) to html.parser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77742
diff
changeset
|
16 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 # Regular expressions used for parsing |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 interesting_normal = re.compile('[&<]') |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
20 incomplete = re.compile('&[a-zA-Z#]') |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
23 charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 starttagopen = re.compile('<[a-zA-Z]') |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 piclose = re.compile('>') |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 commentclose = re.compile(r'--\s*>') |
|
86989
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
28 # Note: |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
29 # 1) the strict attrfind isn't really strict, but we can't make it |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
30 # correctly strict without breaking backward compatibility; |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
31 # 2) if you change tagfind/attrfind remember to update locatestarttagend too; |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
32 # 3) if you change tagfind/attrfind and/or locatestarttagend the parser will |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
33 # explode, so don't do it. |
|
76414
ba4baaddac8d
#14538: HTMLParser can now parse correctly start tags that contain a bare /.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75117
diff
changeset
|
34 tagfind = re.compile('([a-zA-Z][-.a-zA-Z0-9:_]*)(?:\s|/(?!>))*') |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
35 # see http://www.w3.org/TR/html5/tokenization.html#tag-open-state |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
36 # and http://www.w3.org/TR/html5/tokenization.html#tag-name-state |
|
86989
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
37 tagfind_tolerant = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*') |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 attrfind = re.compile( |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' |
|
69189
225400cb6e84
#7311: fix html.parser to accept non-ASCII attribute values.
Ezio Melotti
parents:
68257
diff
changeset
|
40 r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
41 attrfind_tolerant = re.compile( |
|
76414
ba4baaddac8d
#14538: HTMLParser can now parse correctly start tags that contain a bare /.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75117
diff
changeset
|
42 r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' |
|
75117
2d16048b10cd
HTMLParser is now able to handle slashes in the start tag.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74913
diff
changeset
|
43 r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 locatestarttagend = re.compile(r""" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 (?:\s+ # whitespace before attribute name |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 (?:\s*=\s* # value indicator |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 (?:'[^']*' # LITA-enclosed value |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 |\"[^\"]*\" # LIT-enclosed value |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 |[^'\">\s]+ # bare value |
|
35507
15a8975f7fa9
Reverting previous checkin. This breaks too much of HTMLParser to be applied
Georg Brandl <georg@python.org>
parents:
35499
diff
changeset
|
52 ) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 )? |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 ) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 )* |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 \s* # trailing whitespace |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 """, re.VERBOSE) |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
58 locatestarttagend_tolerant = re.compile(r""" |
|
86989
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
59 <[a-zA-Z][^\t\n\r\f />\x00]* # tag name |
|
75117
2d16048b10cd
HTMLParser is now able to handle slashes in the start tag.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74913
diff
changeset
|
60 (?:[\s/]* # optional whitespace before attribute name |
|
2d16048b10cd
HTMLParser is now able to handle slashes in the start tag.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74913
diff
changeset
|
61 (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
62 (?:\s*=+\s* # value indicator |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
63 (?:'[^']*' # LITA-enclosed value |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
64 |"[^"]*" # LIT-enclosed value |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
65 |(?!['"])[^>\s]* # bare value |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
66 ) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
67 (?:\s*,)* # possibly followed by a comma |
|
75117
2d16048b10cd
HTMLParser is now able to handle slashes in the start tag.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74913
diff
changeset
|
68 )?(?:\s|/(?!>))* |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
69 )* |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
70 )? |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
71 \s* # trailing whitespace |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
72 """, re.VERBOSE) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 endendtag = re.compile('>') |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
74 # the HTML 5 spec, section 8.1.2.2, doesn't allow spaces between |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
75 # </ and the tag name, so maybe this should be fixed |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 endtagfind = re.compile('</\s*([a-zA-Z][-.a-zA-Z0-9:_]*)\s*>') |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 class HTMLParseError(Exception): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 """Exception raised for all parse errors.""" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 def __init__(self, msg, position=(None, None)): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 assert msg |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 self.msg = msg |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 self.lineno = position[0] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 self.offset = position[1] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 def __str__(self): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 result = self.msg |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 if self.lineno is not None: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 result = result + ", at line %d" % self.lineno |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 if self.offset is not None: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 result = result + ", column %d" % (self.offset + 1) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 return result |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
97 _strict_sentinel = object() |
|
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
98 |
|
44212
c6fb393b6c81
rename markupbase to _markupbase
Fred Drake <fdrake@acm.org>
parents:
41585
diff
changeset
|
99 class HTMLParser(_markupbase.ParserBase): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
100 """Find tags and other markup and call handler functions. |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
101 |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
102 Usage: |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
103 p = HTMLParser() |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
104 p.feed(data) |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
105 ... |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
106 p.close() |
|
17932
ce7f0e380830
Removed incorrect comment left over from sgmllib.py.
Guido van Rossum <guido@python.org>
parents:
17853
diff
changeset
|
107 |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
108 Start tags are handled by calling self.handle_starttag() or |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
109 self.handle_startendtag(); end tags by self.handle_endtag(). The |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
110 data between tags is passed from the parser to the derived class |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
111 by calling self.handle_data() with the data as argument (the data |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
112 may be split up in arbitrary chunks). Entity references are |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
113 passed by calling self.handle_entityref() with the entity |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
114 reference as the argument. Numeric character references are |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
115 passed to self.handle_charref() with the string containing the |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
116 reference as the argument. |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
117 """ |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 CDATA_CONTENT_ELEMENTS = ("script", "style") |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
121 def __init__(self, strict=_strict_sentinel): |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
122 """Initialize and reset this instance. |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 |
|
77630
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
124 If strict is set to False (the default) the parser will parse invalid |
|
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
125 markup, otherwise it will raise an error. Note that the strict mode |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
126 and argument are deprecated. |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
127 """ |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
128 if strict is not _strict_sentinel: |
|
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
129 warnings.warn("The strict argument and mode are deprecated.", |
|
77630
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
130 DeprecationWarning, stacklevel=2) |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
131 else: |
|
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
132 strict = False # default |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
133 self.strict = strict |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 self.reset() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
135 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 def reset(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
137 """Reset this instance. Loses all unprocessed data.""" |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
138 self.rawdata = '' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 self.lasttag = '???' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 self.interesting = interesting_normal |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
141 self.cdata_elem = None |
|
44212
c6fb393b6c81
rename markupbase to _markupbase
Fred Drake <fdrake@acm.org>
parents:
41585
diff
changeset
|
142 _markupbase.ParserBase.reset(self) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
143 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
144 def feed(self, data): |
|
70407
829c541033ac
Fix display of html.parser.HTMLParser.feed docstring
Éric Araujo <merwok@netwok.org>
parents:
67189
diff
changeset
|
145 r"""Feed data to the parser. |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
146 |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
147 Call this as often as you want, with as little or as much text |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
148 as you want (may include '\n'). |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
149 """ |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 self.rawdata = self.rawdata + data |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 self.goahead(0) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 def close(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
154 """Handle any buffered data.""" |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 self.goahead(1) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
157 def error(self, message): |
|
86842
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
158 warnings.warn("The 'error' method is deprecated.", |
|
0a56709eb798
#15114: The html.parser module now raises a DeprecationWarning when the strict argument of HTMLParser or the HTMLParser.error method are used.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83587
diff
changeset
|
159 DeprecationWarning, stacklevel=2) |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
160 raise HTMLParseError(message, self.getpos()) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 __starttag_text = None |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 def get_starttag_text(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
165 """Return full source of start tag: '<...>'.""" |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 return self.__starttag_text |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
168 def set_cdata_mode(self, elem): |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
169 self.cdata_elem = elem.lower() |
|
73609
0a32e7e3aa1f
#13358: HTMLParser now calls handle_data only once for each CDATA.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73547
diff
changeset
|
170 self.interesting = re.compile(r'</\s*%s\s*>' % self.cdata_elem, re.I) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 def clear_cdata_mode(self): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 self.interesting = interesting_normal |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
174 self.cdata_elem = None |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 # Internal -- handle data as far as reasonable. May leave state |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
177 # and data to be processed by a subsequent call. If 'end' is |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 # true, force handling all data as if followed by EOF marker. |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
179 def goahead(self, end): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
180 rawdata = self.rawdata |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 i = 0 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
182 n = len(rawdata) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
183 while i < n: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
184 match = self.interesting.search(rawdata, i) # < or & |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 if match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 j = match.start() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 else: |
|
73609
0a32e7e3aa1f
#13358: HTMLParser now calls handle_data only once for each CDATA.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73547
diff
changeset
|
188 if self.cdata_elem: |
|
0a32e7e3aa1f
#13358: HTMLParser now calls handle_data only once for each CDATA.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73547
diff
changeset
|
189 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
190 j = n |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 if i < j: self.handle_data(rawdata[i:j]) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
192 i = self.updatepos(i, j) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
193 if i == n: break |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
194 startswith = rawdata.startswith |
|
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
195 if startswith('<', i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 if starttagopen.match(rawdata, i): # < + letter |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 k = self.parse_starttag(i) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
198 elif startswith("</", i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 k = self.parse_endtag(i) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
200 elif startswith("<!--", i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 k = self.parse_comment(i) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
202 elif startswith("<?", i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 k = self.parse_pi(i) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
204 elif startswith("<!", i): |
|
74859
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
205 if self.strict: |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
206 k = self.parse_declaration(i) |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
207 else: |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
208 k = self.parse_html_declaration(i) |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
209 elif (i + 1) < n: |
|
19410
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
210 self.handle_data("<") |
|
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
211 k = i + 1 |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
212 else: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
213 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 if k < 0: |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
215 if not end: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
216 break |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
217 if self.strict: |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
218 self.error("EOF in middle of construct") |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
219 k = rawdata.find('>', i + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
220 if k < 0: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
221 k = rawdata.find('<', i + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
222 if k < 0: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
223 k = i + 1 |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
224 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
225 k += 1 |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
226 self.handle_data(rawdata[i:k]) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 i = self.updatepos(i, k) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
228 elif startswith("&#", i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 match = charref.match(rawdata, i) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 if match: |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
231 name = match.group()[2:-1] |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 self.handle_charref(name) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 k = match.end() |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
234 if not startswith(';', k-1): |
|
19410
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
235 k = k - 1 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 i = self.updatepos(i, k) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 continue |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
238 else: |
|
61889
bf04eaf1af74
Recorded merge of revisions 81500-81501 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
48769
diff
changeset
|
239 if ";" in rawdata[i:]: #bail by consuming &# |
|
bf04eaf1af74
Recorded merge of revisions 81500-81501 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
48769
diff
changeset
|
240 self.handle_data(rawdata[0:2]) |
|
bf04eaf1af74
Recorded merge of revisions 81500-81501 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
48769
diff
changeset
|
241 i = self.updatepos(i, 2) |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
242 break |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
243 elif startswith('&', i): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
244 match = entityref.match(rawdata, i) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 if match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
246 name = match.group(1) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 self.handle_entityref(name) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 k = match.end() |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
249 if not startswith(';', k-1): |
|
19410
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
250 k = k - 1 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 i = self.updatepos(i, k) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 continue |
|
19410
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
253 match = incomplete.match(rawdata, i) |
|
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
254 if match: |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
255 # match.group() will contain at least 2 chars |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
256 if end and match.group() == rawdata[i:]: |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
257 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
258 self.error("EOF in middle of entity or char ref") |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
259 else: |
|
83586
9cb90c1a1a46
#17802: Fix an UnboundLocalError in html.parser. Initial tests by Thomas Barlow.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77742
diff
changeset
|
260 k = match.end() |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
261 if k <= i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
262 k = n |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
263 i = self.updatepos(i, i + 1) |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
264 # incomplete |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
265 break |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
266 elif (i + 1) < n: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
267 # not the end of the buffer, and can't be confused |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
268 # with some other construct |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
269 self.handle_data("&") |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
270 i = self.updatepos(i, i + 1) |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
271 else: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
272 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 assert 0, "interesting.search() lied" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 # end while |
|
73609
0a32e7e3aa1f
#13358: HTMLParser now calls handle_data only once for each CDATA.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73547
diff
changeset
|
276 if end and i < n and not self.cdata_elem: |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
277 self.handle_data(rawdata[i:n]) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
278 i = self.updatepos(i, n) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 self.rawdata = rawdata[i:] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
280 |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
281 # Internal -- parse html declarations, return length or -1 if not terminated |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
282 # See w3.org/TR/html5/tokenization.html#markup-declaration-open-state |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
283 # See also parse_declaration in _markupbase |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
284 def parse_html_declaration(self, i): |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
285 rawdata = self.rawdata |
|
77630
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
286 assert rawdata[i:i+2] == '<!', ('unexpected call to ' |
|
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
287 'parse_html_declaration()') |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
288 if rawdata[i:i+4] == '<!--': |
|
74913
586d688dcf7f
Fix an index and clean up comments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74906
diff
changeset
|
289 # this case is actually already handled in goahead() |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
290 return self.parse_comment(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
291 elif rawdata[i:i+3] == '<![': |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
292 return self.parse_marked_section(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
293 elif rawdata[i:i+9].lower() == '<!doctype': |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
294 # find the closing > |
|
74913
586d688dcf7f
Fix an index and clean up comments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74906
diff
changeset
|
295 gtpos = rawdata.find('>', i+9) |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
296 if gtpos == -1: |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
297 return -1 |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
298 self.handle_decl(rawdata[i+2:gtpos]) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
299 return gtpos+1 |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
300 else: |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
301 return self.parse_bogus_comment(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
302 |
|
74859
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
303 # Internal -- parse bogus comment, return length or -1 if not terminated |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
304 # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
305 def parse_bogus_comment(self, i, report=1): |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
306 rawdata = self.rawdata |
|
77630
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
307 assert rawdata[i:i+2] in ('<!', '</'), ('unexpected call to ' |
|
8dd2f5754b2f
#15114: the strict mode of HTMLParser and the HTMLParseError exception are deprecated now that the parser is able to parse invalid markup.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
76414
diff
changeset
|
308 'parse_comment()') |
|
74859
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
309 pos = rawdata.find('>', i+2) |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
310 if pos == -1: |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
311 return -1 |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
312 if report: |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
313 self.handle_comment(rawdata[i+2:pos]) |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
314 return pos + 1 |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
315 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 # Internal -- parse processing instr, return end or -1 if not terminated |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 def parse_pi(self, i): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 rawdata = self.rawdata |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 assert rawdata[i:i+2] == '<?', 'unexpected call to parse_pi()' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 match = piclose.search(rawdata, i+2) # > |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 if not match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 return -1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 j = match.start() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 self.handle_pi(rawdata[i+2: j]) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 j = match.end() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 return j |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 # Internal -- handle starttag, return end or -1 if not terminated |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 def parse_starttag(self, i): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 self.__starttag_text = None |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 endpos = self.check_for_whole_start_tag(i) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 if endpos < 0: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 return endpos |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 rawdata = self.rawdata |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 self.__starttag_text = rawdata[i:endpos] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 # Now parse the data between i+1 and j into a tag and attrs |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 attrs = [] |
|
86989
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
339 if self.strict: |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
340 match = tagfind.match(rawdata, i+1) |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
341 else: |
|
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
342 match = tagfind_tolerant.match(rawdata, i+1) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 assert match, 'unexpected call to parse_starttag()' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 k = match.end() |
|
76414
ba4baaddac8d
#14538: HTMLParser can now parse correctly start tags that contain a bare /.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
75117
diff
changeset
|
345 self.lasttag = tag = match.group(1).lower() |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 while k < endpos: |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
347 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
348 m = attrfind.match(rawdata, k) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
349 else: |
|
73159
41d41776aa6d
#13273: fix a bug that prevented HTMLParser to properly detect some tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
72270
diff
changeset
|
350 m = attrfind_tolerant.match(rawdata, k) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 if not m: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 break |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 attrname, rest, attrvalue = m.group(1, 2, 3) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 if not rest: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 attrvalue = None |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 attrvalue[:1] == '"' == attrvalue[-1:]: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 attrvalue = attrvalue[1:-1] |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
359 if attrvalue: |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 attrvalue = self.unescape(attrvalue) |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
361 attrs.append((attrname.lower(), attrvalue)) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 k = m.end() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
364 end = rawdata[k:endpos].strip() |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 if end not in (">", "/>"): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 lineno, offset = self.getpos() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 if "\n" in self.__starttag_text: |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
368 lineno = lineno + self.__starttag_text.count("\n") |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 offset = len(self.__starttag_text) \ |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
370 - self.__starttag_text.rfind("\n") |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 offset = offset + len(self.__starttag_text) |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
373 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
374 self.error("junk characters in start tag: %r" |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
375 % (rawdata[k:endpos][:20],)) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
376 self.handle_data(rawdata[i:endpos]) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
377 return endpos |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
378 if end.endswith('/>'): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 # XHTML-style empty tag: <span attr="value" /> |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 self.handle_startendtag(tag, attrs) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 self.handle_starttag(tag, attrs) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 if tag in self.CDATA_CONTENT_ELEMENTS: |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
384 self.set_cdata_mode(tag) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 return endpos |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 # Internal -- check to see if we have a complete starttag; return end |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 # or -1 if incomplete. |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 def check_for_whole_start_tag(self, i): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 rawdata = self.rawdata |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
391 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
392 m = locatestarttagend.match(rawdata, i) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
393 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
394 m = locatestarttagend_tolerant.match(rawdata, i) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 if m: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 j = m.end() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 next = rawdata[j:j+1] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 if next == ">": |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 return j + 1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 if next == "/": |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
401 if rawdata.startswith("/>", j): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 return j + 2 |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
403 if rawdata.startswith("/", j): |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 # buffer boundary |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 return -1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 # else bogus input |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
407 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
408 self.updatepos(i, j + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
409 self.error("malformed empty start tag") |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
410 if j > i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
411 return j |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
412 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
413 return i + 1 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 if next == "": |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 # end of input |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 return -1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 if next in ("abcdefghijklmnopqrstuvwxyz=/" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 # end of input in or before attribute value, or we have the |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 # '/' from a '/>' ending |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 return -1 |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
422 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
423 self.updatepos(i, j) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
424 self.error("malformed start tag") |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
425 if j > i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
426 return j |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
427 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
428 return i + 1 |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
429 raise AssertionError("we should not get here!") |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 # Internal -- parse endtag, return end or -1 if incomplete |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 def parse_endtag(self, i): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 rawdata = self.rawdata |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 assert rawdata[i:i+2] == "</", "unexpected call to parse_endtag" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 match = endendtag.search(rawdata, i+1) # > |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 if not match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 return -1 |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
438 gtpos = match.end() |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 match = endtagfind.match(rawdata, i) # </ + tag + > |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 if not match: |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
441 if self.cdata_elem is not None: |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
442 self.handle_data(rawdata[i:gtpos]) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
443 return gtpos |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
444 if self.strict: |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
445 self.error("bad end tag: %r" % (rawdata[i:gtpos],)) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
446 # find the name: w3.org/TR/html5/tokenization.html#tag-name-state |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
447 namematch = tagfind_tolerant.match(rawdata, i+2) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
448 if not namematch: |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
449 # w3.org/TR/html5/tokenization.html#end-tag-open-state |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
450 if rawdata[i:i+3] == '</>': |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
451 return i+3 |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
452 else: |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
453 return self.parse_bogus_comment(i) |
|
86989
9b9d188ed549
#19480: HTMLParser now accepts all valid start-tag names as defined by the HTML5 standard.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
83586
diff
changeset
|
454 tagname = namematch.group(1).lower() |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
455 # consume and ignore other stuff between the name and the > |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
456 # Note: this is not 100% correct, since we might have things like |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
457 # </tag attr=">">, but looking for > after tha name should cover |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
458 # most of the cases and is much simpler |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
459 gtpos = rawdata.find('>', namematch.end()) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
460 self.handle_endtag(tagname) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
461 return gtpos+1 |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
462 |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
463 elem = match.group(1).lower() # script or style |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
464 if self.cdata_elem is not None: |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
465 if elem != self.cdata_elem: |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
466 self.handle_data(rawdata[i:gtpos]) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
467 return gtpos |
|
73274
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
468 |
|
a6f2244b251f
#670664: Fix HTMLParser to correctly handle the content of ``<script>...</script>`` and ``<style>...</style>``.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73159
diff
changeset
|
469 self.handle_endtag(elem.lower()) |
|
23452
6bae0c31bbfb
Simplify code to remove an unnecessary test.
Fred Drake <fdrake@acm.org>
parents:
21158
diff
changeset
|
470 self.clear_cdata_mode() |
|
74901
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
471 return gtpos |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 # Overridable -- finish processing of start+end tag: <tag.../> |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 def handle_startendtag(self, tag, attrs): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 self.handle_starttag(tag, attrs) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 self.handle_endtag(tag) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 # Overridable -- handle start tag |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 def handle_starttag(self, tag, attrs): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 # Overridable -- handle end tag |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 def handle_endtag(self, tag): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 # Overridable -- handle character reference |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 def handle_charref(self, name): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 # Overridable -- handle entity reference |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 def handle_entityref(self, name): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 # Overridable -- handle data |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 def handle_data(self, data): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 # Overridable -- handle comment |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 def handle_comment(self, data): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 # Overridable -- handle declaration |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 def handle_decl(self, decl): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 # Overridable -- handle processing instruction |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 def handle_pi(self, data): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
510 def unknown_decl(self, data): |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
511 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
512 self.error("unknown declaration: %r" % (data,)) |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
513 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 # Internal -- helper to remove special character quoting |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 def unescape(self, s): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 if '&' not in s: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 return s |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
518 def replaceEntities(s): |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
519 s = s.groups()[0] |
|
67189
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
520 try: |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
521 if s[0] == "#": |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
522 s = s[1:] |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
523 if s[0] in ['x','X']: |
|
77742
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
524 c = int(s[1:].rstrip(';'), 16) |
|
67189
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
525 else: |
|
77742
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
526 c = int(s.rstrip(';')) |
|
67189
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
527 return chr(c) |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
528 except ValueError: |
|
77742
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
529 return '&#' + s |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
530 else: |
|
77742
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
531 from html.entities import html5 |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
532 if s in html5: |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
533 return html5[s] |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
534 elif s.endswith(';'): |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
535 return '&' + s |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
536 for x in range(2, len(s)): |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
537 if s[:x] in html5: |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
538 return html5[s[:x]] + s[x:] |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
539 else: |
|
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
540 return '&' + s |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
541 |
|
77742
0d53703b1a99
#15156: HTMLParser now uses the new "html.entities.html5" dictionary.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
77630
diff
changeset
|
542 return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+;|\w{1,32};?))", |
|
72270
9896fc2a8167
#12888: Fix a bug in HTMLParser.unescape that prevented it to escape more than 128 entities. Patch by Peter Otten.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
70410
diff
changeset
|
543 replaceEntities, s, flags=re.ASCII) |
