Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.35
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
lib /
python2.7 /
Delete
Unzip
Name
Size
Permission
Date
Action
bsddb
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
compiler
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
config-x86_64-linux-gnu
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
ctypes
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
curses
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
dist-packages
[ DIR ]
drwxrwxrwx
2022-03-20 10:38
distutils
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
email
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
encodings
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
ensurepip
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
hotshot
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
importlib
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
json
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
lib-dynload
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
lib-tk
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
lib2to3
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
logging
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
multiprocessing
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
plat-x86_64-linux-gnu
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
pydoc_data
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
sqlite3
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
test
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
unittest
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
wsgiref
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
xml
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
BaseHTTPServer.py
22.21
KB
-rw-r--r--
2022-02-06 21:16
BaseHTTPServer.pyc
21.17
KB
-rw-r--r--
2022-03-20 10:36
Bastion.py
5.61
KB
-rw-r--r--
2022-02-06 21:16
Bastion.pyc
6.47
KB
-rw-r--r--
2022-03-20 10:36
CGIHTTPServer.py
12.78
KB
-rw-r--r--
2022-02-06 21:16
CGIHTTPServer.pyc
10.73
KB
-rw-r--r--
2022-03-20 10:36
ConfigParser.py
27.1
KB
-rw-r--r--
2022-02-06 21:16
ConfigParser.pyc
24.51
KB
-rw-r--r--
2022-03-20 10:36
Cookie.py
25.92
KB
-rw-r--r--
2022-02-06 21:16
Cookie.pyc
22.05
KB
-rw-r--r--
2022-03-20 10:36
DocXMLRPCServer.py
10.52
KB
-rw-r--r--
2022-02-06 21:16
DocXMLRPCServer.pyc
9.92
KB
-rw-r--r--
2022-03-20 10:36
HTMLParser.py
16.73
KB
-rw-r--r--
2022-02-06 21:16
HTMLParser.pyc
13.34
KB
-rw-r--r--
2022-03-20 10:36
LICENSE.txt
12.47
KB
-rw-r--r--
2022-02-06 21:16
MimeWriter.py
6.33
KB
-rw-r--r--
2022-02-06 21:16
MimeWriter.pyc
7.17
KB
-rw-r--r--
2022-03-20 10:36
Queue.py
8.38
KB
-rw-r--r--
2022-02-06 21:16
Queue.pyc
9.15
KB
-rw-r--r--
2022-03-20 10:36
SimpleHTTPServer.py
7.81
KB
-rw-r--r--
2022-02-06 21:16
SimpleHTTPServer.pyc
7.8
KB
-rw-r--r--
2022-03-20 10:36
SimpleXMLRPCServer.py
25.21
KB
-rw-r--r--
2022-02-06 21:16
SimpleXMLRPCServer.pyc
22.26
KB
-rw-r--r--
2022-03-20 10:36
SocketServer.py
23.24
KB
-rw-r--r--
2022-02-06 21:16
SocketServer.pyc
23.39
KB
-rw-r--r--
2022-03-20 10:36
StringIO.py
10.41
KB
-rw-r--r--
2022-02-06 21:16
StringIO.pyc
11.17
KB
-rw-r--r--
2022-03-20 10:36
UserDict.py
6.89
KB
-rw-r--r--
2022-02-06 21:16
UserDict.pyc
9.4
KB
-rw-r--r--
2022-03-20 10:36
UserList.py
3.56
KB
-rw-r--r--
2022-02-06 21:16
UserList.pyc
6.36
KB
-rw-r--r--
2022-03-20 10:36
UserString.py
9.46
KB
-rwxr-xr-x
2022-02-06 21:16
UserString.pyc
14.38
KB
-rw-r--r--
2022-03-20 10:36
_LWPCookieJar.py
6.4
KB
-rw-r--r--
2022-02-06 21:16
_LWPCookieJar.pyc
5.29
KB
-rw-r--r--
2022-03-20 10:36
_MozillaCookieJar.py
5.66
KB
-rw-r--r--
2022-02-06 21:16
_MozillaCookieJar.pyc
4.35
KB
-rw-r--r--
2022-03-20 10:36
__future__.py
4.28
KB
-rw-r--r--
2022-02-06 21:16
__future__.pyc
4.11
KB
-rw-r--r--
2022-03-20 10:36
__phello__.foo.py
64
B
-rw-r--r--
2022-02-06 21:16
__phello__.foo.pyc
123
B
-rw-r--r--
2022-03-20 10:36
_abcoll.py
18.18
KB
-rw-r--r--
2022-02-06 21:16
_abcoll.pyc
24.88
KB
-rw-r--r--
2022-03-20 10:36
_osx_support.py
18.65
KB
-rw-r--r--
2022-02-06 21:16
_osx_support.pyc
11.45
KB
-rw-r--r--
2022-03-20 10:36
_pyio.py
67.96
KB
-rw-r--r--
2022-02-06 21:16
_pyio.pyc
62.82
KB
-rw-r--r--
2022-03-20 10:36
_strptime.py
20.24
KB
-rw-r--r--
2022-02-06 21:16
_strptime.pyc
14.77
KB
-rw-r--r--
2022-03-20 10:36
_sysconfigdata.py
126
B
-rw-r--r--
2022-02-06 21:16
_sysconfigdata.pyc
279
B
-rw-r--r--
2022-03-20 10:36
_threading_local.py
7.28
KB
-rw-r--r--
2022-02-06 21:16
_threading_local.pyc
6.4
KB
-rw-r--r--
2022-03-20 10:36
_weakrefset.py
5.77
KB
-rw-r--r--
2022-02-06 21:16
_weakrefset.pyc
9.36
KB
-rw-r--r--
2022-03-20 10:36
abc.py
6.98
KB
-rw-r--r--
2022-02-06 21:16
abc.pyc
5.98
KB
-rw-r--r--
2022-03-20 10:36
aifc.py
33.49
KB
-rw-r--r--
2022-02-06 21:16
aifc.pyc
29.5
KB
-rw-r--r--
2022-03-20 10:36
antigravity.py
60
B
-rw-r--r--
2022-02-06 21:16
antigravity.pyc
201
B
-rw-r--r--
2022-03-20 10:36
anydbm.py
2.6
KB
-rw-r--r--
2022-02-06 21:16
anydbm.pyc
2.73
KB
-rw-r--r--
2022-03-20 10:36
argparse.egg-info
217
B
-rw-r--r--
2022-02-06 21:16
argparse.py
87.04
KB
-rw-r--r--
2022-02-06 21:16
argparse.pyc
62.54
KB
-rw-r--r--
2022-03-20 10:36
ast.py
11.53
KB
-rw-r--r--
2022-02-06 21:16
ast.pyc
12.59
KB
-rw-r--r--
2022-03-20 10:36
asynchat.py
11.33
KB
-rw-r--r--
2022-02-06 21:16
asynchat.pyc
8.55
KB
-rw-r--r--
2022-03-20 10:36
asyncore.py
20.36
KB
-rw-r--r--
2022-02-06 21:16
asyncore.pyc
18.28
KB
-rw-r--r--
2022-03-20 10:36
atexit.py
1.67
KB
-rw-r--r--
2022-02-06 21:16
atexit.pyc
2.14
KB
-rw-r--r--
2022-03-20 10:36
audiodev.py
7.42
KB
-rw-r--r--
2022-02-06 21:16
audiodev.pyc
8.22
KB
-rw-r--r--
2022-03-20 10:36
base64.py
11.53
KB
-rwxr-xr-x
2022-02-06 21:16
base64.pyc
11
KB
-rw-r--r--
2022-03-20 10:36
bdb.py
21.21
KB
-rw-r--r--
2022-02-06 21:16
bdb.pyc
18.53
KB
-rw-r--r--
2022-03-20 10:36
binhex.py
14.35
KB
-rw-r--r--
2022-02-06 21:16
binhex.pyc
15
KB
-rw-r--r--
2022-03-20 10:36
bisect.py
2.53
KB
-rw-r--r--
2022-02-06 21:16
bisect.pyc
2.99
KB
-rw-r--r--
2022-03-20 10:36
cProfile.py
6.36
KB
-rwxr-xr-x
2022-02-06 21:16
cProfile.pyc
6.13
KB
-rw-r--r--
2022-03-20 10:36
calendar.py
22.84
KB
-rw-r--r--
2022-02-06 21:16
calendar.pyc
27.1
KB
-rw-r--r--
2022-03-20 10:36
cgi.py
34.35
KB
-rwxr-xr-x
2022-02-06 21:16
cgi.pyc
31.92
KB
-rw-r--r--
2022-03-20 10:36
cgitb.py
11.89
KB
-rw-r--r--
2022-02-06 21:16
cgitb.pyc
11.85
KB
-rw-r--r--
2022-03-20 10:36
chunk.py
5.29
KB
-rw-r--r--
2022-02-06 21:16
chunk.pyc
5.45
KB
-rw-r--r--
2022-03-20 10:36
cmd.py
14.67
KB
-rw-r--r--
2022-02-06 21:16
cmd.pyc
13.67
KB
-rw-r--r--
2022-03-20 10:36
code.py
9.95
KB
-rw-r--r--
2022-02-06 21:16
code.pyc
10.06
KB
-rw-r--r--
2022-03-20 10:36
codecs.py
35.25
KB
-rw-r--r--
2022-02-06 21:16
codecs.pyc
35.8
KB
-rw-r--r--
2022-03-20 10:36
codeop.py
5.86
KB
-rw-r--r--
2022-02-06 21:16
codeop.pyc
6.42
KB
-rw-r--r--
2022-03-20 10:36
collections.py
27.15
KB
-rw-r--r--
2022-02-06 21:16
collections.pyc
25.45
KB
-rw-r--r--
2022-03-20 10:36
colorsys.py
3.6
KB
-rw-r--r--
2022-02-06 21:16
colorsys.pyc
3.88
KB
-rw-r--r--
2022-03-20 10:36
commands.py
2.49
KB
-rw-r--r--
2022-02-06 21:16
commands.pyc
2.4
KB
-rw-r--r--
2022-03-20 10:36
compileall.py
7.58
KB
-rw-r--r--
2022-02-06 21:16
compileall.pyc
6.84
KB
-rw-r--r--
2022-03-20 10:36
contextlib.py
4.32
KB
-rw-r--r--
2022-02-06 21:16
contextlib.pyc
4.33
KB
-rw-r--r--
2022-03-20 10:36
cookielib.py
63.74
KB
-rw-r--r--
2022-02-06 21:16
cookielib.pyc
53.1
KB
-rw-r--r--
2022-03-20 10:36
copy.py
11.26
KB
-rw-r--r--
2022-02-06 21:16
copy.pyc
11.83
KB
-rw-r--r--
2022-03-20 10:36
copy_reg.py
6.64
KB
-rw-r--r--
2022-02-06 21:16
copy_reg.pyc
4.95
KB
-rw-r--r--
2022-03-20 10:36
csv.py
16.32
KB
-rw-r--r--
2022-02-06 21:16
csv.pyc
13.14
KB
-rw-r--r--
2022-03-20 10:36
dbhash.py
498
B
-rw-r--r--
2022-02-06 21:16
dbhash.pyc
714
B
-rw-r--r--
2022-03-20 10:36
decimal.py
216.73
KB
-rw-r--r--
2022-02-06 21:16
decimal.pyc
167.62
KB
-rw-r--r--
2022-03-20 10:36
difflib.py
80.4
KB
-rw-r--r--
2022-02-06 21:16
difflib.pyc
60.34
KB
-rw-r--r--
2022-03-20 10:36
dircache.py
1.1
KB
-rw-r--r--
2022-02-06 21:16
dircache.pyc
1.53
KB
-rw-r--r--
2022-03-20 10:36
dis.py
6.35
KB
-rw-r--r--
2022-02-06 21:16
dis.pyc
6.07
KB
-rw-r--r--
2022-03-20 10:36
doctest.py
102.75
KB
-rw-r--r--
2022-02-06 21:16
doctest.pyc
81.49
KB
-rw-r--r--
2022-03-20 10:36
dumbdbm.py
8.93
KB
-rw-r--r--
2022-02-06 21:16
dumbdbm.pyc
6.55
KB
-rw-r--r--
2022-03-20 10:36
dummy_thread.py
4.31
KB
-rw-r--r--
2022-02-06 21:16
dummy_thread.pyc
5.24
KB
-rw-r--r--
2022-03-20 10:36
dummy_threading.py
2.74
KB
-rw-r--r--
2022-02-06 21:16
dummy_threading.pyc
1.25
KB
-rw-r--r--
2022-03-20 10:36
filecmp.py
9.36
KB
-rw-r--r--
2022-02-06 21:16
filecmp.pyc
9.36
KB
-rw-r--r--
2022-03-20 10:36
fileinput.py
13.42
KB
-rw-r--r--
2022-02-06 21:16
fileinput.pyc
14.1
KB
-rw-r--r--
2022-03-20 10:36
fnmatch.py
3.24
KB
-rw-r--r--
2022-02-06 21:16
fnmatch.pyc
3.52
KB
-rw-r--r--
2022-03-20 10:36
formatter.py
14.56
KB
-rw-r--r--
2022-02-06 21:16
formatter.pyc
18.58
KB
-rw-r--r--
2022-03-20 10:36
fpformat.py
4.59
KB
-rw-r--r--
2022-02-06 21:16
fpformat.pyc
4.55
KB
-rw-r--r--
2022-03-20 10:36
fractions.py
21.87
KB
-rw-r--r--
2022-02-06 21:16
fractions.pyc
19.17
KB
-rw-r--r--
2022-03-20 10:36
ftplib.py
37.23
KB
-rw-r--r--
2022-02-06 21:16
ftplib.pyc
33.81
KB
-rw-r--r--
2022-03-20 10:36
functools.py
4.37
KB
-rw-r--r--
2022-02-06 21:16
functools.pyc
5.86
KB
-rw-r--r--
2022-03-20 10:36
genericpath.py
3.13
KB
-rw-r--r--
2022-02-06 21:16
genericpath.pyc
3.41
KB
-rw-r--r--
2022-03-20 10:36
getopt.py
7.15
KB
-rw-r--r--
2022-02-06 21:16
getopt.pyc
6.48
KB
-rw-r--r--
2022-03-20 10:36
getpass.py
5.43
KB
-rw-r--r--
2022-02-06 21:16
getpass.pyc
4.62
KB
-rw-r--r--
2022-03-20 10:36
gettext.py
22.06
KB
-rw-r--r--
2022-02-06 21:16
gettext.pyc
17.45
KB
-rw-r--r--
2022-03-20 10:36
glob.py
3.04
KB
-rw-r--r--
2022-02-06 21:16
glob.pyc
2.86
KB
-rw-r--r--
2022-03-20 10:36
gzip.py
18.58
KB
-rw-r--r--
2022-02-06 21:16
gzip.pyc
14.78
KB
-rw-r--r--
2022-03-20 10:36
hashlib.py
7.66
KB
-rw-r--r--
2022-02-06 21:16
hashlib.pyc
6.73
KB
-rw-r--r--
2022-03-20 10:36
heapq.py
17.87
KB
-rw-r--r--
2022-02-06 21:16
heapq.pyc
14.19
KB
-rw-r--r--
2022-03-20 10:36
hmac.py
4.48
KB
-rw-r--r--
2022-02-06 21:16
hmac.pyc
4.42
KB
-rw-r--r--
2022-03-20 10:36
htmlentitydefs.py
17.63
KB
-rw-r--r--
2022-02-06 21:16
htmlentitydefs.pyc
6.22
KB
-rw-r--r--
2022-03-20 10:36
htmllib.py
12.57
KB
-rw-r--r--
2022-02-06 21:16
htmllib.pyc
19.66
KB
-rw-r--r--
2022-03-20 10:36
httplib.py
50.26
KB
-rw-r--r--
2022-02-06 21:16
httplib.pyc
35.86
KB
-rw-r--r--
2022-03-20 10:36
ihooks.py
18.54
KB
-rw-r--r--
2022-02-06 21:16
ihooks.pyc
20.74
KB
-rw-r--r--
2022-03-20 10:36
imaplib.py
47.28
KB
-rw-r--r--
2022-02-06 21:16
imaplib.pyc
44.07
KB
-rw-r--r--
2022-03-20 10:36
imghdr.py
3.46
KB
-rw-r--r--
2022-02-06 21:16
imghdr.pyc
4.69
KB
-rw-r--r--
2022-03-20 10:36
imputil.py
25.16
KB
-rw-r--r--
2022-02-06 21:16
imputil.pyc
15.18
KB
-rw-r--r--
2022-03-20 10:36
inspect.py
41.62
KB
-rw-r--r--
2022-02-06 21:16
inspect.pyc
38.97
KB
-rw-r--r--
2022-03-20 10:36
io.py
3.24
KB
-rw-r--r--
2022-02-06 21:16
io.pyc
3.5
KB
-rw-r--r--
2022-03-20 10:36
keyword.py
1.95
KB
-rwxr-xr-x
2022-02-06 21:16
keyword.pyc
2.05
KB
-rw-r--r--
2022-03-20 10:36
linecache.py
3.93
KB
-rw-r--r--
2022-02-06 21:16
linecache.pyc
3.18
KB
-rw-r--r--
2022-03-20 10:36
locale.py
97.19
KB
-rw-r--r--
2022-02-06 21:16
locale.pyc
53.69
KB
-rw-r--r--
2022-03-20 10:36
macpath.py
6.14
KB
-rw-r--r--
2022-02-06 21:16
macpath.pyc
7.46
KB
-rw-r--r--
2022-03-20 10:36
macurl2path.py
2.67
KB
-rw-r--r--
2022-02-06 21:16
macurl2path.pyc
2.18
KB
-rw-r--r--
2022-03-20 10:36
mailbox.py
79.34
KB
-rw-r--r--
2022-02-06 21:16
mailbox.pyc
74.49
KB
-rw-r--r--
2022-03-20 10:36
mailcap.py
7.25
KB
-rw-r--r--
2022-02-06 21:16
mailcap.pyc
6.89
KB
-rw-r--r--
2022-03-20 10:36
markupbase.py
14.3
KB
-rw-r--r--
2022-02-06 21:16
markupbase.pyc
9.02
KB
-rw-r--r--
2022-03-20 10:36
md5.py
358
B
-rw-r--r--
2022-02-06 21:16
md5.pyc
376
B
-rw-r--r--
2022-03-20 10:36
mhlib.py
32.65
KB
-rw-r--r--
2022-02-06 21:16
mhlib.pyc
32.83
KB
-rw-r--r--
2022-03-20 10:36
mimetools.py
7
KB
-rw-r--r--
2022-02-06 21:16
mimetools.pyc
7.97
KB
-rw-r--r--
2022-03-20 10:36
mimetypes.py
20.45
KB
-rw-r--r--
2022-02-06 21:16
mimetypes.pyc
17.96
KB
-rw-r--r--
2022-03-20 10:36
mimify.py
14.67
KB
-rwxr-xr-x
2022-02-06 21:16
mimify.pyc
11.69
KB
-rw-r--r--
2022-03-20 10:36
modulefinder.py
23.89
KB
-rw-r--r--
2022-02-06 21:16
modulefinder.pyc
18.61
KB
-rw-r--r--
2022-03-20 10:36
multifile.py
4.71
KB
-rw-r--r--
2022-02-06 21:16
multifile.pyc
5.26
KB
-rw-r--r--
2022-03-20 10:36
mutex.py
1.83
KB
-rw-r--r--
2022-02-06 21:16
mutex.pyc
2.44
KB
-rw-r--r--
2022-03-20 10:36
netrc.py
5.73
KB
-rw-r--r--
2022-02-06 21:16
netrc.pyc
4.54
KB
-rw-r--r--
2022-03-20 10:36
new.py
610
B
-rw-r--r--
2022-02-06 21:16
new.pyc
860
B
-rw-r--r--
2022-03-20 10:36
nntplib.py
20.97
KB
-rw-r--r--
2022-02-06 21:16
nntplib.pyc
20.46
KB
-rw-r--r--
2022-03-20 10:36
ntpath.py
18.97
KB
-rw-r--r--
2022-02-06 21:16
ntpath.pyc
12.78
KB
-rw-r--r--
2022-03-20 10:36
nturl2path.py
2.36
KB
-rw-r--r--
2022-02-06 21:16
nturl2path.pyc
1.77
KB
-rw-r--r--
2022-03-20 10:36
numbers.py
10.08
KB
-rw-r--r--
2022-02-06 21:16
numbers.pyc
13.56
KB
-rw-r--r--
2022-03-20 10:36
opcode.py
5.35
KB
-rw-r--r--
2022-02-06 21:16
opcode.pyc
5.99
KB
-rw-r--r--
2022-03-20 10:36
optparse.py
59.77
KB
-rw-r--r--
2022-02-06 21:16
optparse.pyc
52.36
KB
-rw-r--r--
2022-03-20 10:36
os.py
25.3
KB
-rw-r--r--
2022-02-06 21:16
os.pyc
24.98
KB
-rw-r--r--
2022-03-20 10:36
os2emxpath.py
4.53
KB
-rw-r--r--
2022-02-06 21:16
os2emxpath.pyc
4.4
KB
-rw-r--r--
2022-03-20 10:36
pdb.doc
7.73
KB
-rw-r--r--
2022-02-06 21:16
pdb.py
45.02
KB
-rwxr-xr-x
2022-02-06 21:16
pdb.pyc
42.42
KB
-rw-r--r--
2022-03-20 10:36
pickle.py
44.42
KB
-rw-r--r--
2022-02-06 21:16
pickle.pyc
37.45
KB
-rw-r--r--
2022-03-20 10:36
pickletools.py
72.79
KB
-rw-r--r--
2022-02-06 21:16
pickletools.pyc
55.64
KB
-rw-r--r--
2022-03-20 10:36
pipes.py
9.36
KB
-rw-r--r--
2022-02-06 21:16
pipes.pyc
9.06
KB
-rw-r--r--
2022-03-20 10:36
pkgutil.py
19.87
KB
-rw-r--r--
2022-02-06 21:16
pkgutil.pyc
18.42
KB
-rw-r--r--
2022-03-20 10:36
platform.py
51.38
KB
-rwxr-xr-x
2022-02-06 21:16
platform.pyc
36.84
KB
-rw-r--r--
2022-03-20 10:36
plistlib.py
14.83
KB
-rw-r--r--
2022-02-06 21:16
plistlib.pyc
18.67
KB
-rw-r--r--
2022-03-20 10:36
popen2.py
8.22
KB
-rw-r--r--
2022-02-06 21:16
popen2.pyc
8.78
KB
-rw-r--r--
2022-03-20 10:36
poplib.py
12.52
KB
-rw-r--r--
2022-02-06 21:16
poplib.pyc
12.97
KB
-rw-r--r--
2022-03-20 10:36
posixfile.py
7.82
KB
-rw-r--r--
2022-02-06 21:16
posixfile.pyc
7.45
KB
-rw-r--r--
2022-03-20 10:36
posixpath.py
13.61
KB
-rw-r--r--
2022-02-06 21:16
posixpath.pyc
11.12
KB
-rw-r--r--
2022-03-20 10:36
pprint.py
11.5
KB
-rw-r--r--
2022-02-06 21:16
pprint.pyc
9.92
KB
-rw-r--r--
2022-03-20 10:36
profile.py
22.25
KB
-rwxr-xr-x
2022-02-06 21:16
profile.pyc
15.99
KB
-rw-r--r--
2022-03-20 10:36
pstats.py
26.09
KB
-rw-r--r--
2022-02-06 21:16
pstats.pyc
24.31
KB
-rw-r--r--
2022-03-20 10:36
pty.py
4.94
KB
-rw-r--r--
2022-02-06 21:16
pty.pyc
4.83
KB
-rw-r--r--
2022-03-20 10:36
py_compile.py
6.14
KB
-rw-r--r--
2022-02-06 21:16
py_compile.pyc
6.46
KB
-rw-r--r--
2022-03-20 10:36
pyclbr.py
13.07
KB
-rw-r--r--
2022-02-06 21:16
pyclbr.pyc
9.4
KB
-rw-r--r--
2022-03-20 10:36
pydoc.py
93.56
KB
-rwxr-xr-x
2022-02-06 21:16
pydoc.pyc
89.91
KB
-rw-r--r--
2022-03-20 10:36
quopri.py
6.8
KB
-rwxr-xr-x
2022-02-06 21:16
quopri.pyc
6.4
KB
-rw-r--r--
2022-03-20 10:36
random.py
31.57
KB
-rw-r--r--
2022-02-06 21:16
random.pyc
24.89
KB
-rw-r--r--
2022-03-20 10:36
re.py
13.11
KB
-rw-r--r--
2022-02-06 21:16
re.pyc
13.06
KB
-rw-r--r--
2022-03-20 10:36
repr.py
4.2
KB
-rw-r--r--
2022-02-06 21:16
repr.pyc
5.23
KB
-rw-r--r--
2022-03-20 10:36
rexec.py
19.68
KB
-rw-r--r--
2022-02-06 21:16
rexec.pyc
23.13
KB
-rw-r--r--
2022-03-20 10:36
rfc822.py
32.76
KB
-rw-r--r--
2022-02-06 21:16
rfc822.pyc
30.95
KB
-rw-r--r--
2022-03-20 10:36
rlcompleter.py
5.85
KB
-rw-r--r--
2022-02-06 21:16
rlcompleter.pyc
5.92
KB
-rw-r--r--
2022-03-20 10:36
robotparser.py
7.41
KB
-rw-r--r--
2022-02-06 21:16
robotparser.pyc
7.73
KB
-rw-r--r--
2022-03-20 10:36
runpy.py
10.82
KB
-rw-r--r--
2022-02-06 21:16
runpy.pyc
8.56
KB
-rw-r--r--
2022-03-20 10:36
sched.py
4.97
KB
-rw-r--r--
2022-02-06 21:16
sched.pyc
4.86
KB
-rw-r--r--
2022-03-20 10:36
sets.py
18.6
KB
-rw-r--r--
2022-02-06 21:16
sets.pyc
16.39
KB
-rw-r--r--
2022-03-20 10:36
sgmllib.py
17.46
KB
-rw-r--r--
2022-02-06 21:16
sgmllib.pyc
14.98
KB
-rw-r--r--
2022-03-20 10:36
sha.py
393
B
-rw-r--r--
2022-02-06 21:16
sha.pyc
419
B
-rw-r--r--
2022-03-20 10:36
shelve.py
7.99
KB
-rw-r--r--
2022-02-06 21:16
shelve.pyc
9.96
KB
-rw-r--r--
2022-03-20 10:36
shlex.py
10.9
KB
-rw-r--r--
2022-02-06 21:16
shlex.pyc
7.36
KB
-rw-r--r--
2022-03-20 10:36
shutil.py
18.63
KB
-rw-r--r--
2022-02-06 21:16
shutil.pyc
18.12
KB
-rw-r--r--
2022-03-20 10:36
site.py
19.48
KB
-rw-r--r--
2022-02-06 21:16
site.pyc
19.08
KB
-rw-r--r--
2022-03-20 10:36
sitecustomize.py
155
B
-rw-r--r--
2017-11-24 18:33
sitecustomize.pyc
232
B
-rw-r--r--
2022-03-20 10:36
smtpd.py
18.11
KB
-rwxr-xr-x
2022-02-06 21:16
smtpd.pyc
15.45
KB
-rw-r--r--
2022-03-20 10:36
smtplib.py
31.35
KB
-rwxr-xr-x
2022-02-06 21:16
smtplib.pyc
29.47
KB
-rw-r--r--
2022-03-20 10:36
sndhdr.py
5.83
KB
-rw-r--r--
2022-02-06 21:16
sndhdr.pyc
7.16
KB
-rw-r--r--
2022-03-20 10:36
socket.py
20.13
KB
-rw-r--r--
2022-02-06 21:16
socket.pyc
15.71
KB
-rw-r--r--
2022-03-20 10:36
sre.py
384
B
-rw-r--r--
2022-02-06 21:16
sre.pyc
517
B
-rw-r--r--
2022-03-20 10:36
sre_compile.py
19.35
KB
-rw-r--r--
2022-02-06 21:16
sre_compile.pyc
12.24
KB
-rw-r--r--
2022-03-20 10:36
sre_constants.py
7.03
KB
-rw-r--r--
2022-02-06 21:16
sre_constants.pyc
6.04
KB
-rw-r--r--
2022-03-20 10:36
sre_parse.py
28.23
KB
-rw-r--r--
2022-02-06 21:16
sre_parse.pyc
19.48
KB
-rw-r--r--
2022-03-20 10:36
ssl.py
36.92
KB
-rw-r--r--
2022-02-06 21:16
ssl.pyc
31.47
KB
-rw-r--r--
2022-03-20 10:36
stat.py
1.8
KB
-rw-r--r--
2022-02-06 21:16
stat.pyc
2.67
KB
-rw-r--r--
2022-03-20 10:36
statvfs.py
898
B
-rw-r--r--
2022-02-06 21:16
statvfs.pyc
618
B
-rw-r--r--
2022-03-20 10:36
string.py
21.04
KB
-rw-r--r--
2022-02-06 21:16
string.pyc
19.88
KB
-rw-r--r--
2022-03-20 10:36
stringold.py
12.16
KB
-rw-r--r--
2022-02-06 21:16
stringold.pyc
12.2
KB
-rw-r--r--
2022-03-20 10:36
stringprep.py
13.21
KB
-rw-r--r--
2022-02-06 21:16
stringprep.pyc
14.11
KB
-rw-r--r--
2022-03-20 10:36
struct.py
82
B
-rw-r--r--
2022-02-06 21:16
struct.pyc
237
B
-rw-r--r--
2022-03-20 10:36
subprocess.py
48.26
KB
-rw-r--r--
2022-02-06 21:16
subprocess.pyc
30.8
KB
-rw-r--r--
2022-03-20 10:36
sunau.py
16.82
KB
-rw-r--r--
2022-02-06 21:16
sunau.pyc
17.87
KB
-rw-r--r--
2022-03-20 10:36
sunaudio.py
1.37
KB
-rw-r--r--
2022-02-06 21:16
sunaudio.pyc
1.93
KB
-rw-r--r--
2022-03-20 10:36
symbol.py
2.01
KB
-rwxr-xr-x
2022-02-06 21:16
symbol.pyc
2.95
KB
-rw-r--r--
2022-03-20 10:36
symtable.py
7.26
KB
-rw-r--r--
2022-02-06 21:16
symtable.pyc
11.41
KB
-rw-r--r--
2022-03-20 10:36
sysconfig.py
24.61
KB
-rw-r--r--
2022-02-06 21:16
sysconfig.pyc
18.19
KB
-rw-r--r--
2022-03-20 10:36
tabnanny.py
11.07
KB
-rwxr-xr-x
2022-02-06 21:16
tabnanny.pyc
8.01
KB
-rw-r--r--
2022-03-20 10:36
tarfile.py
88.53
KB
-rw-r--r--
2022-02-06 21:16
tarfile.pyc
74.07
KB
-rw-r--r--
2022-03-20 10:36
telnetlib.py
26.41
KB
-rw-r--r--
2022-02-06 21:16
telnetlib.pyc
22.54
KB
-rw-r--r--
2022-03-20 10:36
tempfile.py
19.09
KB
-rw-r--r--
2022-02-06 21:16
tempfile.pyc
19.76
KB
-rw-r--r--
2022-03-20 10:36
textwrap.py
16.81
KB
-rw-r--r--
2022-02-06 21:16
textwrap.pyc
11.72
KB
-rw-r--r--
2022-03-20 10:36
this.py
1002
B
-rw-r--r--
2022-02-06 21:16
this.pyc
1.19
KB
-rw-r--r--
2022-03-20 10:36
threading.py
46.03
KB
-rw-r--r--
2022-02-06 21:16
threading.pyc
41.44
KB
-rw-r--r--
2022-03-20 10:36
timeit.py
12.49
KB
-rwxr-xr-x
2022-02-06 21:16
timeit.pyc
11.87
KB
-rw-r--r--
2022-03-20 10:36
toaiff.py
3.07
KB
-rw-r--r--
2022-02-06 21:16
toaiff.pyc
3.03
KB
-rw-r--r--
2022-03-20 10:36
token.py
2.85
KB
-rw-r--r--
2022-02-06 21:16
token.pyc
3.72
KB
-rw-r--r--
2022-03-20 10:36
tokenize.py
17.07
KB
-rw-r--r--
2022-02-06 21:16
tokenize.pyc
14.13
KB
-rw-r--r--
2022-03-20 10:36
trace.py
29.19
KB
-rwxr-xr-x
2022-02-06 21:16
trace.pyc
22.19
KB
-rw-r--r--
2022-03-20 10:36
traceback.py
11.02
KB
-rw-r--r--
2022-02-06 21:16
traceback.pyc
11.37
KB
-rw-r--r--
2022-03-20 10:36
tty.py
879
B
-rw-r--r--
2022-02-06 21:16
tty.pyc
1.28
KB
-rw-r--r--
2022-03-20 10:36
types.py
2.04
KB
-rw-r--r--
2022-02-06 21:16
types.pyc
2.65
KB
-rw-r--r--
2022-03-20 10:36
urllib.py
58.68
KB
-rw-r--r--
2022-02-06 21:16
urllib.pyc
49.75
KB
-rw-r--r--
2022-03-20 10:36
urllib2.py
51.28
KB
-rw-r--r--
2022-02-06 21:16
urllib2.pyc
45.92
KB
-rw-r--r--
2022-03-20 10:36
urlparse.py
16.06
KB
-rw-r--r--
2022-02-06 21:16
urlparse.pyc
15.07
KB
-rw-r--r--
2022-03-20 10:36
user.py
1.59
KB
-rw-r--r--
2022-02-06 21:16
user.pyc
1.68
KB
-rw-r--r--
2022-03-20 10:36
uu.py
6.4
KB
-rwxr-xr-x
2022-02-06 21:16
uu.pyc
4.2
KB
-rw-r--r--
2022-03-20 10:36
uuid.py
22.08
KB
-rw-r--r--
2022-02-06 21:16
uuid.pyc
21.95
KB
-rw-r--r--
2022-03-20 10:36
warnings.py
14.4
KB
-rw-r--r--
2022-02-06 21:16
warnings.pyc
13.12
KB
-rw-r--r--
2022-03-20 10:36
wave.py
18.15
KB
-rw-r--r--
2022-02-06 21:16
wave.pyc
19.44
KB
-rw-r--r--
2022-03-20 10:36
weakref.py
13.28
KB
-rw-r--r--
2022-02-06 21:16
weakref.pyc
15.37
KB
-rw-r--r--
2022-03-20 10:36
webbrowser.py
22.25
KB
-rwxr-xr-x
2022-02-06 21:16
webbrowser.pyc
19.26
KB
-rw-r--r--
2022-03-20 10:36
whichdb.py
3.3
KB
-rw-r--r--
2022-02-06 21:16
whichdb.pyc
2.18
KB
-rw-r--r--
2022-03-20 10:36
wsgiref.egg-info
187
B
-rw-r--r--
2022-02-06 21:16
xdrlib.py
5.93
KB
-rw-r--r--
2022-02-06 21:16
xdrlib.pyc
9.59
KB
-rw-r--r--
2022-03-20 10:36
xmllib.py
34.05
KB
-rw-r--r--
2022-02-06 21:16
xmllib.pyc
26.11
KB
-rw-r--r--
2022-03-20 10:36
xmlrpclib.py
50.91
KB
-rw-r--r--
2022-02-06 21:16
xmlrpclib.pyc
42.8
KB
-rw-r--r--
2022-03-20 10:36
zipfile.py
57.64
KB
-rw-r--r--
2022-02-06 21:16
zipfile.pyc
40.52
KB
-rw-r--r--
2022-03-20 10:36
Save
Rename
"""A parser for HTML and XHTML.""" # This file is based on sgmllib.py, but the API is slightly different. # XXX There should be a way to distinguish between PCDATA (parsed # character data -- the normal case), RCDATA (replaceable character # data -- only char and entity references and end tags are special) # and CDATA (character data -- only end tags are special). import markupbase import re # Regular expressions used for parsing interesting_normal = re.compile('[&<]') incomplete = re.compile('&[a-zA-Z#]') entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') starttagopen = re.compile('<[a-zA-Z]') piclose = re.compile('>') commentclose = re.compile(r'--\s*>') # see http://www.w3.org/TR/html5/tokenization.html#tag-open-state # and http://www.w3.org/TR/html5/tokenization.html#tag-name-state # note: if you change tagfind/attrfind remember to update locatestarttagend too tagfind = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*') # this regex is currently unused, but left for backward compatibility tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') attrfind = re.compile( r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') locatestarttagend = re.compile(r""" <[a-zA-Z][^\t\n\r\f />\x00]* # tag name (?:[\s/]* # optional whitespace before attribute name (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace """, re.VERBOSE) endendtag = re.compile('>') # the HTML 5 spec, section 8.1.2.2, doesn't allow spaces between # </ and the tag name, so maybe this should be fixed endtagfind = re.compile('</\s*([a-zA-Z][-.a-zA-Z0-9:_]*)\s*>') class HTMLParseError(Exception): """Exception raised for all parse errors.""" def __init__(self, msg, position=(None, None)): assert msg self.msg = msg self.lineno = position[0] self.offset = position[1] def __str__(self): result = self.msg if self.lineno is not None: result = result + ", at line %d" % self.lineno if self.offset is not None: result = result + ", column %d" % (self.offset + 1) return result class HTMLParser(markupbase.ParserBase): """Find tags and other markup and call handler functions. Usage: p = HTMLParser() p.feed(data) ... p.close() Start tags are handled by calling self.handle_starttag() or self.handle_startendtag(); end tags by self.handle_endtag(). The data between tags is passed from the parser to the derived class by calling self.handle_data() with the data as argument (the data may be split up in arbitrary chunks). Entity references are passed by calling self.handle_entityref() with the entity reference as the argument. Numeric character references are passed to self.handle_charref() with the string containing the reference as the argument. """ CDATA_CONTENT_ELEMENTS = ("script", "style") def __init__(self): """Initialize and reset this instance.""" self.reset() def reset(self): """Reset this instance. Loses all unprocessed data.""" self.rawdata = '' self.lasttag = '???' self.interesting = interesting_normal self.cdata_elem = None markupbase.ParserBase.reset(self) def feed(self, data): r"""Feed data to the parser. Call this as often as you want, with as little or as much text as you want (may include '\n'). """ self.rawdata = self.rawdata + data self.goahead(0) def close(self): """Handle any buffered data.""" self.goahead(1) def error(self, message): raise HTMLParseError(message, self.getpos()) __starttag_text = None def get_starttag_text(self): """Return full source of start tag: '<...>'.""" return self.__starttag_text def set_cdata_mode(self, elem): self.cdata_elem = elem.lower() self.interesting = re.compile(r'</\s*%s\s*>' % self.cdata_elem, re.I) def clear_cdata_mode(self): self.interesting = interesting_normal self.cdata_elem = None # Internal -- handle data as far as reasonable. May leave state # and data to be processed by a subsequent call. If 'end' is # true, force handling all data as if followed by EOF marker. def goahead(self, end): rawdata = self.rawdata i = 0 n = len(rawdata) while i < n: match = self.interesting.search(rawdata, i) # < or & if match: j = match.start() else: if self.cdata_elem: break j = n if i < j: self.handle_data(rawdata[i:j]) i = self.updatepos(i, j) if i == n: break startswith = rawdata.startswith if startswith('<', i): if starttagopen.match(rawdata, i): # < + letter k = self.parse_starttag(i) elif startswith("</", i): k = self.parse_endtag(i) elif startswith("<!--", i): k = self.parse_comment(i) elif startswith("<?", i): k = self.parse_pi(i) elif startswith("<!", i): k = self.parse_html_declaration(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 else: break if k < 0: if not end: break k = rawdata.find('>', i + 1) if k < 0: k = rawdata.find('<', i + 1) if k < 0: k = i + 1 else: k += 1 self.handle_data(rawdata[i:k]) i = self.updatepos(i, k) elif startswith("&#", i): match = charref.match(rawdata, i) if match: name = match.group()[2:-1] self.handle_charref(name) k = match.end() if not startswith(';', k-1): k = k - 1 i = self.updatepos(i, k) continue else: if ";" in rawdata[i:]: # bail by consuming '&#' self.handle_data(rawdata[i:i+2]) i = self.updatepos(i, i+2) break elif startswith('&', i): match = entityref.match(rawdata, i) if match: name = match.group(1) self.handle_entityref(name) k = match.end() if not startswith(';', k-1): k = k - 1 i = self.updatepos(i, k) continue match = incomplete.match(rawdata, i) if match: # match.group() will contain at least 2 chars if end and match.group() == rawdata[i:]: self.error("EOF in middle of entity or char ref") # incomplete break elif (i + 1) < n: # not the end of the buffer, and can't be confused # with some other construct self.handle_data("&") i = self.updatepos(i, i + 1) else: break else: assert 0, "interesting.search() lied" # end while if end and i < n and not self.cdata_elem: self.handle_data(rawdata[i:n]) i = self.updatepos(i, n) self.rawdata = rawdata[i:] # Internal -- parse html declarations, return length or -1 if not terminated # See w3.org/TR/html5/tokenization.html#markup-declaration-open-state # See also parse_declaration in _markupbase def parse_html_declaration(self, i): rawdata = self.rawdata if rawdata[i:i+2] != '<!': self.error('unexpected call to parse_html_declaration()') if rawdata[i:i+4] == '<!--': # this case is actually already handled in goahead() return self.parse_comment(i) elif rawdata[i:i+3] == '<![': return self.parse_marked_section(i) elif rawdata[i:i+9].lower() == '<!doctype': # find the closing > gtpos = rawdata.find('>', i+9) if gtpos == -1: return -1 self.handle_decl(rawdata[i+2:gtpos]) return gtpos+1 else: return self.parse_bogus_comment(i) # Internal -- parse bogus comment, return length or -1 if not terminated # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state def parse_bogus_comment(self, i, report=1): rawdata = self.rawdata if rawdata[i:i+2] not in ('<!', '</'): self.error('unexpected call to parse_comment()') pos = rawdata.find('>', i+2) if pos == -1: return -1 if report: self.handle_comment(rawdata[i+2:pos]) return pos + 1 # Internal -- parse processing instr, return end or -1 if not terminated def parse_pi(self, i): rawdata = self.rawdata assert rawdata[i:i+2] == '<?', 'unexpected call to parse_pi()' match = piclose.search(rawdata, i+2) # > if not match: return -1 j = match.start() self.handle_pi(rawdata[i+2: j]) j = match.end() return j # Internal -- handle starttag, return end or -1 if not terminated def parse_starttag(self, i): self.__starttag_text = None endpos = self.check_for_whole_start_tag(i) if endpos < 0: return endpos rawdata = self.rawdata self.__starttag_text = rawdata[i:endpos] # Now parse the data between i+1 and j into a tag and attrs attrs = [] match = tagfind.match(rawdata, i+1) assert match, 'unexpected call to parse_starttag()' k = match.end() self.lasttag = tag = match.group(1).lower() while k < endpos: m = attrfind.match(rawdata, k) if not m: break attrname, rest, attrvalue = m.group(1, 2, 3) if not rest: attrvalue = None elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ attrvalue[:1] == '"' == attrvalue[-1:]: attrvalue = attrvalue[1:-1] if attrvalue: attrvalue = self.unescape(attrvalue) attrs.append((attrname.lower(), attrvalue)) k = m.end() end = rawdata[k:endpos].strip() if end not in (">", "/>"): lineno, offset = self.getpos() if "\n" in self.__starttag_text: lineno = lineno + self.__starttag_text.count("\n") offset = len(self.__starttag_text) \ - self.__starttag_text.rfind("\n") else: offset = offset + len(self.__starttag_text) self.handle_data(rawdata[i:endpos]) return endpos if end.endswith('/>'): # XHTML-style empty tag: <span attr="value" /> self.handle_startendtag(tag, attrs) else: self.handle_starttag(tag, attrs) if tag in self.CDATA_CONTENT_ELEMENTS: self.set_cdata_mode(tag) return endpos # Internal -- check to see if we have a complete starttag; return end # or -1 if incomplete. def check_for_whole_start_tag(self, i): rawdata = self.rawdata m = locatestarttagend.match(rawdata, i) if m: j = m.end() next = rawdata[j:j+1] if next == ">": return j + 1 if next == "/": if rawdata.startswith("/>", j): return j + 2 if rawdata.startswith("/", j): # buffer boundary return -1 # else bogus input self.updatepos(i, j + 1) self.error("malformed empty start tag") if next == "": # end of input return -1 if next in ("abcdefghijklmnopqrstuvwxyz=/" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): # end of input in or before attribute value, or we have the # '/' from a '/>' ending return -1 if j > i: return j else: return i + 1 raise AssertionError("we should not get here!") # Internal -- parse endtag, return end or -1 if incomplete def parse_endtag(self, i): rawdata = self.rawdata assert rawdata[i:i+2] == "</", "unexpected call to parse_endtag" match = endendtag.search(rawdata, i+1) # > if not match: return -1 gtpos = match.end() match = endtagfind.match(rawdata, i) # </ + tag + > if not match: if self.cdata_elem is not None: self.handle_data(rawdata[i:gtpos]) return gtpos # find the name: w3.org/TR/html5/tokenization.html#tag-name-state namematch = tagfind.match(rawdata, i+2) if not namematch: # w3.org/TR/html5/tokenization.html#end-tag-open-state if rawdata[i:i+3] == '</>': return i+3 else: return self.parse_bogus_comment(i) tagname = namematch.group(1).lower() # consume and ignore other stuff between the name and the > # Note: this is not 100% correct, since we might have things like # </tag attr=">">, but looking for > after tha name should cover # most of the cases and is much simpler gtpos = rawdata.find('>', namematch.end()) self.handle_endtag(tagname) return gtpos+1 elem = match.group(1).lower() # script or style if self.cdata_elem is not None: if elem != self.cdata_elem: self.handle_data(rawdata[i:gtpos]) return gtpos self.handle_endtag(elem) self.clear_cdata_mode() return gtpos # Overridable -- finish processing of start+end tag: <tag.../> def handle_startendtag(self, tag, attrs): self.handle_starttag(tag, attrs) self.handle_endtag(tag) # Overridable -- handle start tag def handle_starttag(self, tag, attrs): pass # Overridable -- handle end tag def handle_endtag(self, tag): pass # Overridable -- handle character reference def handle_charref(self, name): pass # Overridable -- handle entity reference def handle_entityref(self, name): pass # Overridable -- handle data def handle_data(self, data): pass # Overridable -- handle comment def handle_comment(self, data): pass # Overridable -- handle declaration def handle_decl(self, decl): pass # Overridable -- handle processing instruction def handle_pi(self, data): pass def unknown_decl(self, data): pass # Internal -- helper to remove special character quoting entitydefs = None def unescape(self, s): if '&' not in s: return s def replaceEntities(s): s = s.groups()[0] try: if s[0] == "#": s = s[1:] if s[0] in ['x','X']: c = int(s[1:], 16) else: c = int(s) return unichr(c) except ValueError: return '&#'+s+';' else: # Cannot use name2codepoint directly, because HTMLParser supports apos, # which is not part of HTML 4 import htmlentitydefs if HTMLParser.entitydefs is None: entitydefs = HTMLParser.entitydefs = {'apos':u"'"} for k, v in htmlentitydefs.name2codepoint.iteritems(): entitydefs[k] = unichr(v) try: return self.entitydefs[s] except KeyError: return '&'+s+';' return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)