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