Mercurial > cpython-lru_cache-weakref
annotate Lib/html/parser.py @ 74917:76dfd1f08025
lib2to3 tests: Don't use deprecated API, switch to assertRegex()
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Mon, 13 Feb 2012 23:31:26 +0100 |
| parents | 586d688dcf7f |
| children | 2d16048b10cd |
| 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 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 # 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
|
15 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 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
|
17 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
|
18 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 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
|
20 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
|
21 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 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
|
23 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
|
24 commentclose = re.compile(r'--\s*>') |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 tagfind = re.compile('[a-zA-Z][-.a-zA-Z0-9:_]*') |
|
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
|
26 # 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
|
27 # and http://www.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
|
28 tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
29 # Note, the strict one of this pair isn't really strict, but we can't |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
30 # make it correctly strict without breaking backward compatibility. |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 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
|
32 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
|
33 r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
34 attrfind_tolerant = re.compile( |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
35 r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
36 r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?') |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 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
|
38 <[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
|
39 (?:\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
|
40 (?:[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
|
41 (?:\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
|
42 (?:'[^']*' # 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
|
43 |\"[^\"]*\" # 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
|
44 |[^'\">\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
|
45 ) |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 )? |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 ) |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 )* |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 \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
|
50 """, re.VERBOSE) |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
51 locatestarttagend_tolerant = re.compile(r""" |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
52 <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
53 (?:\s* # optional whitespace before attribute name |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
54 (?:(?<=['"\s])[^\s/>][^\s/=>]* # attribute name |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
55 (?:\s*=+\s* # value indicator |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
56 (?:'[^']*' # 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
|
57 |"[^"]*" # LIT-enclosed value |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
58 |(?!['"])[^>\s]* # bare value |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
59 ) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
60 (?:\s*,)* # possibly followed by a comma |
|
73547
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
61 )?\s* |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
62 )* |
|
16ed15ff0d7c
#1745761, #755670, #13357, #12629, #1200313: improve attribute handling in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73274
diff
changeset
|
63 )? |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
64 \s* # trailing whitespace |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
65 """, 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
|
66 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
|
67 # 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
|
68 # </ 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
|
69 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
|
70 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 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
|
73 """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
|
74 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 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
|
76 assert msg |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 return result |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 |
|
44212
c6fb393b6c81
rename markupbase to _markupbase
Fred Drake <fdrake@acm.org>
parents:
41585
diff
changeset
|
90 class HTMLParser(_markupbase.ParserBase): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
91 """Find tags and other markup and call handler functions. |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
92 |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
93 Usage: |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
94 p = HTMLParser() |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
95 p.feed(data) |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
96 ... |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
97 p.close() |
|
17932
ce7f0e380830
Removed incorrect comment left over from sgmllib.py.
Guido van Rossum <guido@python.org>
parents:
17853
diff
changeset
|
98 |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 passed by calling self.handle_entityref() with the entity |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
105 reference as the argument. Numeric character references are |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
106 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
|
107 reference as the argument. |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
108 """ |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 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
|
111 |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
112 def __init__(self, strict=True): |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
113 """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
|
114 |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
115 If strict is set to True (the default), errors are raised when invalid |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
116 HTML is encountered. If set to False, an attempt is instead made to |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
117 continue parsing, making "best guesses" about the intended meaning, in |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
118 a fashion similar to what browsers typically do. |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
119 """ |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
120 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
|
121 self.reset() |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 def reset(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
124 """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
|
125 self.rawdata = '' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 self.lasttag = '???' |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 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
|
128 self.cdata_elem = None |
|
44212
c6fb393b6c81
rename markupbase to _markupbase
Fred Drake <fdrake@acm.org>
parents:
41585
diff
changeset
|
129 _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
|
130 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 def feed(self, data): |
|
70407
829c541033ac
Fix display of html.parser.HTMLParser.feed docstring
Éric Araujo <merwok@netwok.org>
parents:
67189
diff
changeset
|
132 r"""Feed data to the parser. |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
133 |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
134 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
|
135 as you want (may include '\n'). |
|
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
136 """ |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 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
|
138 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
|
139 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 def close(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
141 """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
|
142 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
|
143 |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
144 def error(self, message): |
|
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
145 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
|
146 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
147 __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
|
148 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 def get_starttag_text(self): |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
150 """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
|
151 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
|
152 |
|
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
|
153 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
|
154 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
|
155 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
|
156 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 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
|
158 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
|
159 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
|
160 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 # 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
|
162 # 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
|
163 # 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
|
164 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
|
165 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
|
166 i = 0 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 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
|
168 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
|
169 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
|
170 if match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 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
|
172 else: |
|
73609
0a32e7e3aa1f
#13358: HTMLParser now calls handle_data only once for each CDATA.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73547
diff
changeset
|
173 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
|
174 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 j = n |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 startswith = rawdata.startswith |
|
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
180 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
|
181 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
|
182 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
|
183 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
|
184 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
|
185 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
|
186 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 else: |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
193 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
|
194 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
|
195 self.handle_data("<") |
|
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
196 k = i + 1 |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
197 else: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
198 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 if k < 0: |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
200 if not end: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
201 break |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
202 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
|
203 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
|
204 k = rawdata.find('>', i + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
205 if k < 0: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
206 k = rawdata.find('<', i + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
207 if k < 0: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
208 k = i + 1 |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
209 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
210 k += 1 |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 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
|
215 if match: |
|
18984
00935031b373
Change some comments into docstrings.
Fred Drake <fdrake@acm.org>
parents:
17934
diff
changeset
|
216 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
|
217 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
|
218 k = match.end() |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
219 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
|
220 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
|
221 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
|
222 continue |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
223 else: |
|
61889
bf04eaf1af74
Recorded merge of revisions 81500-81501 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
48769
diff
changeset
|
224 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
|
225 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
|
226 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
|
227 break |
|
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 = 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
|
230 if match: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 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
|
232 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
|
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 |
|
19410
c403af003884
Deal more appropriately with bare ampersands and pointy brackets; this
Fred Drake <fdrake@acm.org>
parents:
18984
diff
changeset
|
238 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
|
239 if match: |
|
19682
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
240 # 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
|
241 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
|
242 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
243 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
|
244 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
245 if k <= i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
246 k = n |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
247 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
|
248 # incomplete |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
249 break |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
250 elif (i + 1) < n: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
251 # 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
|
252 # with some other construct |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
253 self.handle_data("&") |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
254 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
|
255 else: |
|
8dfb13a4e175
Added reasonable parsing of the DOCTYPE declaration, fixed edge cases
Fred Drake <fdrake@acm.org>
parents:
19410
diff
changeset
|
256 break |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
257 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 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
|
259 # 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
265 # 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
|
266 # 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
|
267 # See also parse_declaration in _markupbase |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
268 def parse_html_declaration(self, i): |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
269 rawdata = self.rawdata |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
270 if rawdata[i:i+2] != '<!': |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
271 self.error('unexpected call to parse_html_declaration()') |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
272 if rawdata[i:i+4] == '<!--': |
|
74913
586d688dcf7f
Fix an index and clean up comments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74906
diff
changeset
|
273 # 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
|
274 return self.parse_comment(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
275 elif rawdata[i:i+3] == '<![': |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
276 return self.parse_marked_section(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
277 elif rawdata[i:i+9].lower() == '<!doctype': |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
278 # find the closing > |
|
74913
586d688dcf7f
Fix an index and clean up comments.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74906
diff
changeset
|
279 gtpos = rawdata.find('>', i+9) |
|
74906
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
280 if gtpos == -1: |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
281 return -1 |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
282 self.handle_decl(rawdata[i+2:gtpos]) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
283 return gtpos+1 |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
284 else: |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
285 return self.parse_bogus_comment(i) |
|
4c4ff9fd19b6
Improve handling of declarations in HTMLParser.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74901
diff
changeset
|
286 |
|
74859
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
287 # 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
|
288 # 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
|
289 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
|
290 rawdata = self.rawdata |
|
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
|
291 if rawdata[i:i+2] not in ('<!', '</'): |
|
74859
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
292 self.error('unexpected call to parse_comment()') |
|
242b697449d8
#13960: HTMLParser is now able to handle broken comments when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
73609
diff
changeset
|
293 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
|
294 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
|
295 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
|
296 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
|
297 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
|
298 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
|
299 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 # 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
|
301 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
|
302 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
|
303 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
|
304 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
|
305 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
|
306 return -1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 return j |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 # 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 return endpos |
|
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 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
|
320 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 # 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
|
322 attrs = [] |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 match = tagfind.match(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
|
324 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
|
325 k = match.end() |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
326 self.lasttag = tag = rawdata[i+1:k].lower() |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 while k < endpos: |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
328 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
329 m = attrfind.match(rawdata, k) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 break |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 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
|
335 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
|
336 attrvalue = None |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
345 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
|
346 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
|
347 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
|
348 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
|
349 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
|
350 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
|
351 - 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
|
352 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 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
|
354 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
355 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
|
356 % (rawdata[k:endpos][:20],)) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
357 self.handle_data(rawdata[i:endpos]) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
358 return endpos |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
359 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
|
360 # 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
|
361 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
|
362 else: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 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
|
364 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
|
365 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
|
366 return endpos |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 # 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
|
369 # 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
|
370 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
|
371 rawdata = self.rawdata |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
372 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
373 m = locatestarttagend.match(rawdata, i) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
374 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
375 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
|
376 if m: |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 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
|
378 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
|
379 if next == ">": |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 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
|
381 if next == "/": |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
382 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
|
383 return j + 2 |
|
21158
1acc4ba73b9d
Convert to using string methods instead of the string module.
Fred Drake <fdrake@acm.org>
parents:
20067
diff
changeset
|
384 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
|
385 # buffer boundary |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 return -1 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 # else bogus input |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
388 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
389 self.updatepos(i, j + 1) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
390 self.error("malformed empty start tag") |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
391 if j > i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
392 return j |
|
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 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
|
395 if next == "": |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 # 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
|
397 return -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 in ("abcdefghijklmnopqrstuvwxyz=/" |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 # 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
|
401 # '/' 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
|
402 return -1 |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
403 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
404 self.updatepos(i, j) |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
405 self.error("malformed start tag") |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
406 if j > i: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
407 return j |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
408 else: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
409 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
|
410 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
|
411 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 # 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
|
413 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
|
414 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
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 return gtpos |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
425 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
|
426 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
|
427 # 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
|
428 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
|
429 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
|
430 # 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
|
431 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
|
432 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
|
433 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
|
434 return self.parse_bogus_comment(i) |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
435 tagname = namematch.group().lower() |
|
df5e5eea7833
#13993: HTMLParser is now able to handle broken end tags when strict=False.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
74859
diff
changeset
|
436 # 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
|
437 # 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
|
438 # </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
|
439 # 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
|
440 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
|
441 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
|
442 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
|
443 |
|
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
|
444 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 |
|
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
|
450 self.handle_endtag(elem.lower()) |
|
23452
6bae0c31bbfb
Simplify code to remove an unnecessary test.
Fred Drake <fdrake@acm.org>
parents:
21158
diff
changeset
|
451 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
|
452 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
|
453 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 # 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
|
455 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
|
456 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
|
457 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
|
458 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
459 # 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
|
460 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
|
461 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 # 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
|
464 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
|
465 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
467 # 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
|
468 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
|
469 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 # 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
|
472 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
|
473 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 # 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
|
476 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
|
477 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 # 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
|
480 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
|
481 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 # 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
|
484 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
|
485 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 # 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
|
488 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
|
489 pass |
|
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 |
|
20067
299f5fcb0ba8
Re-factor the HTMLParser class to use the new markupbase.ParserBase class.
Fred Drake <fdrake@acm.org>
parents:
19953
diff
changeset
|
491 def unknown_decl(self, data): |
|
66623
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
492 if self.strict: |
|
1cbfeffea19f
#1486713: Add a tolerant mode to HTMLParser.
R. David Murray <rdmurray@bitdance.com>
parents:
61889
diff
changeset
|
493 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
|
494 |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 # Internal -- helper to remove special character quoting |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
496 entitydefs = None |
|
17853
055fc046e080
A much improved HTML parser -- a replacement for sgmllib. The API is
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 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
|
498 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
|
499 return s |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
500 def replaceEntities(s): |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
501 s = s.groups()[0] |
|
67189
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
502 try: |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
503 if s[0] == "#": |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
504 s = s[1:] |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
505 if s[0] in ['x','X']: |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
506 c = int(s[1:], 16) |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
507 else: |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
508 c = int(s) |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
509 return chr(c) |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
510 except ValueError: |
|
3546ce1aa355
Merged revisions 87542 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
61889
diff
changeset
|
511 return '&#'+ s +';' |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
512 else: |
|
47147
7296a2fb4786
rename HTMLParser to html.parser and htmlentitydefs to html.entities;
Fred Drake <fdrake@acm.org>
parents:
44212
diff
changeset
|
513 # Cannot use name2codepoint directly, because HTMLParser |
|
7296a2fb4786
rename HTMLParser to html.parser and htmlentitydefs to html.entities;
Fred Drake <fdrake@acm.org>
parents:
44212
diff
changeset
|
514 # supports apos, which is not part of HTML 4 |
|
7296a2fb4786
rename HTMLParser to html.parser and htmlentitydefs to html.entities;
Fred Drake <fdrake@acm.org>
parents:
44212
diff
changeset
|
515 import html.entities |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
516 if HTMLParser.entitydefs is None: |
|
41575
beacf40b5960
Rip out all the u"..." literals and calls to unicode().
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
517 entitydefs = HTMLParser.entitydefs = {'apos':"'"} |
|
47147
7296a2fb4786
rename HTMLParser to html.parser and htmlentitydefs to html.entities;
Fred Drake <fdrake@acm.org>
parents:
44212
diff
changeset
|
518 for k, v in html.entities.name2codepoint.items(): |
|
47205
7aa9ad658014
Change test_htmlparser to reflect the HTMLParser -> html.parser
Mark Dickinson <dickinsm@gmail.com>
parents:
47147
diff
changeset
|
519 entitydefs[k] = chr(v) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
520 try: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
521 return self.entitydefs[s] |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
522 except KeyError: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
523 return '&'+s+';' |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
35507
diff
changeset
|
524 |
|
47147
7296a2fb4786
rename HTMLParser to html.parser and htmlentitydefs to html.entities;
Fred Drake <fdrake@acm.org>
parents:
44212
diff
changeset
|
525 return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", |
|
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
|
526 replaceEntities, s, flags=re.ASCII) |
