Mercurial > repos > miller-lab > genome_diversity
annotate BeautifulSoup.py @ 32:03c22b722882
remove BeautifulSoup dependency
author | Richard Burhans <burhans@bx.psu.edu> |
---|---|
date | Fri, 20 Sep 2013 13:54:23 -0400 |
parents | |
children |
rev | line source |
---|---|
32
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1 """Beautiful Soup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2 Elixir and Tonic |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
3 "The Screen-Scraper's Friend" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
4 http://www.crummy.com/software/BeautifulSoup/ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
5 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
6 Beautiful Soup parses a (possibly invalid) XML or HTML document into a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
7 tree representation. It provides methods and Pythonic idioms that make |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
8 it easy to navigate, search, and modify the tree. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
9 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
10 A well-formed XML/HTML document yields a well-formed data |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
11 structure. An ill-formed XML/HTML document yields a correspondingly |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
12 ill-formed data structure. If your document is only locally |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
13 well-formed, you can use this library to find and process the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
14 well-formed part of it. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
15 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
16 Beautiful Soup works with Python 2.2 and up. It has no external |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
17 dependencies, but you'll have more success at converting data to UTF-8 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
18 if you also install these three packages: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
19 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
20 * chardet, for auto-detecting character encodings |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
21 http://chardet.feedparser.org/ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
22 * cjkcodecs and iconv_codec, which add more encodings to the ones supported |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
23 by stock Python. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
24 http://cjkpython.i18n.org/ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
25 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
26 Beautiful Soup defines classes for two main parsing strategies: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
27 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
28 * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
29 language that kind of looks like XML. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
30 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
31 * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
32 or invalid. This class has web browser-like heuristics for |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
33 obtaining a sensible parse tree in the face of common HTML errors. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
34 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
35 Beautiful Soup also defines a class (UnicodeDammit) for autodetecting |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
36 the encoding of an HTML or XML document, and converting it to |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
37 Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
38 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
39 For more than you ever wanted to know about Beautiful Soup, see the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
40 documentation: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
41 http://www.crummy.com/software/BeautifulSoup/documentation.html |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
42 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
43 Here, have some legalese: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
44 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
45 Copyright (c) 2004-2010, Leonard Richardson |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
46 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
47 All rights reserved. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
48 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
49 Redistribution and use in source and binary forms, with or without |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
50 modification, are permitted provided that the following conditions are |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
51 met: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
52 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
53 * Redistributions of source code must retain the above copyright |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
54 notice, this list of conditions and the following disclaimer. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
55 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
56 * Redistributions in binary form must reproduce the above |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
57 copyright notice, this list of conditions and the following |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
58 disclaimer in the documentation and/or other materials provided |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
59 with the distribution. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
60 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
61 * Neither the name of the the Beautiful Soup Consortium and All |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
62 Night Kosher Bakery nor the names of its contributors may be |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
63 used to endorse or promote products derived from this software |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
64 without specific prior written permission. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
65 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
66 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
67 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
68 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
69 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
70 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
71 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
72 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
73 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
74 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
75 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
76 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
77 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
78 """ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
79 from __future__ import generators |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
80 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
81 __author__ = "Leonard Richardson (leonardr@segfault.org)" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
82 __version__ = "3.2.1" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
83 __copyright__ = "Copyright (c) 2004-2012 Leonard Richardson" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
84 __license__ = "New-style BSD" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
85 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
86 from sgmllib import SGMLParser, SGMLParseError |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
87 import codecs |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
88 import markupbase |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
89 import types |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
90 import re |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
91 import sgmllib |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
92 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
93 from htmlentitydefs import name2codepoint |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
94 except ImportError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
95 name2codepoint = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
96 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
97 set |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
98 except NameError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
99 from sets import Set as set |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
100 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
101 #These hacks make Beautiful Soup able to parse XML with namespaces |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
102 sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
103 markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
104 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
105 DEFAULT_OUTPUT_ENCODING = "utf-8" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
106 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
107 def _match_css_class(str): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
108 """Build a RE to match the given CSS class.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
109 return re.compile(r"(^|.*\s)%s($|\s)" % str) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
110 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
111 # First, the classes that represent markup elements. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
112 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
113 class PageElement(object): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
114 """Contains the navigational information for some part of the page |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
115 (either a tag or a piece of text)""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
116 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
117 def _invert(h): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
118 "Cheap function to invert a hash." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
119 i = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
120 for k,v in h.items(): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
121 i[v] = k |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
122 return i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
123 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
124 XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
125 "quot" : '"', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
126 "amp" : "&", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
127 "lt" : "<", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
128 "gt" : ">" } |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
129 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
130 XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
131 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
132 def setup(self, parent=None, previous=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
133 """Sets up the initial relations between this element and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
134 other elements.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
135 self.parent = parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
136 self.previous = previous |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
137 self.next = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
138 self.previousSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
139 self.nextSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
140 if self.parent and self.parent.contents: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
141 self.previousSibling = self.parent.contents[-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
142 self.previousSibling.nextSibling = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
143 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
144 def replaceWith(self, replaceWith): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
145 oldParent = self.parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
146 myIndex = self.parent.index(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
147 if hasattr(replaceWith, "parent")\ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
148 and replaceWith.parent is self.parent: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
149 # We're replacing this element with one of its siblings. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
150 index = replaceWith.parent.index(replaceWith) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
151 if index and index < myIndex: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
152 # Furthermore, it comes before this element. That |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
153 # means that when we extract it, the index of this |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
154 # element will change. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
155 myIndex = myIndex - 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
156 self.extract() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
157 oldParent.insert(myIndex, replaceWith) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
158 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
159 def replaceWithChildren(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
160 myParent = self.parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
161 myIndex = self.parent.index(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
162 self.extract() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
163 reversedChildren = list(self.contents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
164 reversedChildren.reverse() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
165 for child in reversedChildren: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
166 myParent.insert(myIndex, child) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
167 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
168 def extract(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
169 """Destructively rips this element out of the tree.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
170 if self.parent: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
171 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
172 del self.parent.contents[self.parent.index(self)] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
173 except ValueError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
174 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
175 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
176 #Find the two elements that would be next to each other if |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
177 #this element (and any children) hadn't been parsed. Connect |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
178 #the two. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
179 lastChild = self._lastRecursiveChild() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
180 nextElement = lastChild.next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
181 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
182 if self.previous: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
183 self.previous.next = nextElement |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
184 if nextElement: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
185 nextElement.previous = self.previous |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
186 self.previous = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
187 lastChild.next = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
188 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
189 self.parent = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
190 if self.previousSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
191 self.previousSibling.nextSibling = self.nextSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
192 if self.nextSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
193 self.nextSibling.previousSibling = self.previousSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
194 self.previousSibling = self.nextSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
195 return self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
196 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
197 def _lastRecursiveChild(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
198 "Finds the last element beneath this object to be parsed." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
199 lastChild = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
200 while hasattr(lastChild, 'contents') and lastChild.contents: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
201 lastChild = lastChild.contents[-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
202 return lastChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
203 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
204 def insert(self, position, newChild): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
205 if isinstance(newChild, basestring) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
206 and not isinstance(newChild, NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
207 newChild = NavigableString(newChild) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
208 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
209 position = min(position, len(self.contents)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
210 if hasattr(newChild, 'parent') and newChild.parent is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
211 # We're 'inserting' an element that's already one |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
212 # of this object's children. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
213 if newChild.parent is self: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
214 index = self.index(newChild) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
215 if index > position: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
216 # Furthermore we're moving it further down the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
217 # list of this object's children. That means that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
218 # when we extract this element, our target index |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
219 # will jump down one. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
220 position = position - 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
221 newChild.extract() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
222 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
223 newChild.parent = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
224 previousChild = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
225 if position == 0: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
226 newChild.previousSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
227 newChild.previous = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
228 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
229 previousChild = self.contents[position-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
230 newChild.previousSibling = previousChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
231 newChild.previousSibling.nextSibling = newChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
232 newChild.previous = previousChild._lastRecursiveChild() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
233 if newChild.previous: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
234 newChild.previous.next = newChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
235 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
236 newChildsLastElement = newChild._lastRecursiveChild() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
237 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
238 if position >= len(self.contents): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
239 newChild.nextSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
240 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
241 parent = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
242 parentsNextSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
243 while not parentsNextSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
244 parentsNextSibling = parent.nextSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
245 parent = parent.parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
246 if not parent: # This is the last element in the document. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
247 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
248 if parentsNextSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
249 newChildsLastElement.next = parentsNextSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
250 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
251 newChildsLastElement.next = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
252 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
253 nextChild = self.contents[position] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
254 newChild.nextSibling = nextChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
255 if newChild.nextSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
256 newChild.nextSibling.previousSibling = newChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
257 newChildsLastElement.next = nextChild |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
258 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
259 if newChildsLastElement.next: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
260 newChildsLastElement.next.previous = newChildsLastElement |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
261 self.contents.insert(position, newChild) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
262 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
263 def append(self, tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
264 """Appends the given tag to the contents of this tag.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
265 self.insert(len(self.contents), tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
266 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
267 def findNext(self, name=None, attrs={}, text=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
268 """Returns the first item that matches the given criteria and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
269 appears after this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
270 return self._findOne(self.findAllNext, name, attrs, text, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
271 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
272 def findAllNext(self, name=None, attrs={}, text=None, limit=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
273 **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
274 """Returns all items that match the given criteria and appear |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
275 after this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
276 return self._findAll(name, attrs, text, limit, self.nextGenerator, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
277 **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
278 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
279 def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
280 """Returns the closest sibling to this Tag that matches the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
281 given criteria and appears after this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
282 return self._findOne(self.findNextSiblings, name, attrs, text, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
283 **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
284 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
285 def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
286 **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
287 """Returns the siblings of this Tag that match the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
288 criteria and appear after this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
289 return self._findAll(name, attrs, text, limit, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
290 self.nextSiblingGenerator, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
291 fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
292 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
293 def findPrevious(self, name=None, attrs={}, text=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
294 """Returns the first item that matches the given criteria and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
295 appears before this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
296 return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
297 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
298 def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
299 **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
300 """Returns all items that match the given criteria and appear |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
301 before this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
302 return self._findAll(name, attrs, text, limit, self.previousGenerator, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
303 **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
304 fetchPrevious = findAllPrevious # Compatibility with pre-3.x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
305 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
306 def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
307 """Returns the closest sibling to this Tag that matches the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
308 given criteria and appears before this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
309 return self._findOne(self.findPreviousSiblings, name, attrs, text, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
310 **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
311 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
312 def findPreviousSiblings(self, name=None, attrs={}, text=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
313 limit=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
314 """Returns the siblings of this Tag that match the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
315 criteria and appear before this Tag in the document.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
316 return self._findAll(name, attrs, text, limit, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
317 self.previousSiblingGenerator, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
318 fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
319 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
320 def findParent(self, name=None, attrs={}, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
321 """Returns the closest parent of this Tag that matches the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
322 criteria.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
323 # NOTE: We can't use _findOne because findParents takes a different |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
324 # set of arguments. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
325 r = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
326 l = self.findParents(name, attrs, 1) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
327 if l: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
328 r = l[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
329 return r |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
330 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
331 def findParents(self, name=None, attrs={}, limit=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
332 """Returns the parents of this Tag that match the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
333 criteria.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
334 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
335 return self._findAll(name, attrs, None, limit, self.parentGenerator, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
336 **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
337 fetchParents = findParents # Compatibility with pre-3.x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
338 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
339 #These methods do the real heavy lifting. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
340 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
341 def _findOne(self, method, name, attrs, text, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
342 r = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
343 l = method(name, attrs, text, 1, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
344 if l: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
345 r = l[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
346 return r |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
347 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
348 def _findAll(self, name, attrs, text, limit, generator, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
349 "Iterates over a generator looking for things that match." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
350 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
351 if isinstance(name, SoupStrainer): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
352 strainer = name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
353 # (Possibly) special case some findAll*(...) searches |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
354 elif text is None and not limit and not attrs and not kwargs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
355 # findAll*(True) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
356 if name is True: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
357 return [element for element in generator() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
358 if isinstance(element, Tag)] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
359 # findAll*('tag-name') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
360 elif isinstance(name, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
361 return [element for element in generator() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
362 if isinstance(element, Tag) and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
363 element.name == name] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
364 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
365 strainer = SoupStrainer(name, attrs, text, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
366 # Build a SoupStrainer |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
367 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
368 strainer = SoupStrainer(name, attrs, text, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
369 results = ResultSet(strainer) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
370 g = generator() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
371 while True: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
372 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
373 i = g.next() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
374 except StopIteration: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
375 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
376 if i: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
377 found = strainer.search(i) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
378 if found: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
379 results.append(found) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
380 if limit and len(results) >= limit: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
381 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
382 return results |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
383 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
384 #These Generators can be used to navigate starting from both |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
385 #NavigableStrings and Tags. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
386 def nextGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
387 i = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
388 while i is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
389 i = i.next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
390 yield i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
391 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
392 def nextSiblingGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
393 i = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
394 while i is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
395 i = i.nextSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
396 yield i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
397 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
398 def previousGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
399 i = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
400 while i is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
401 i = i.previous |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
402 yield i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
403 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
404 def previousSiblingGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
405 i = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
406 while i is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
407 i = i.previousSibling |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
408 yield i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
409 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
410 def parentGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
411 i = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
412 while i is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
413 i = i.parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
414 yield i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
415 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
416 # Utility methods |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
417 def substituteEncoding(self, str, encoding=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
418 encoding = encoding or "utf-8" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
419 return str.replace("%SOUP-ENCODING%", encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
420 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
421 def toEncoding(self, s, encoding=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
422 """Encodes an object to a string in some encoding, or to Unicode. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
423 .""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
424 if isinstance(s, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
425 if encoding: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
426 s = s.encode(encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
427 elif isinstance(s, str): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
428 if encoding: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
429 s = s.encode(encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
430 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
431 s = unicode(s) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
432 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
433 if encoding: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
434 s = self.toEncoding(str(s), encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
435 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
436 s = unicode(s) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
437 return s |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
438 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
439 BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
440 + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
441 + ")") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
442 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
443 def _sub_entity(self, x): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
444 """Used with a regular expression to substitute the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
445 appropriate XML entity for an XML special character.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
446 return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
447 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
448 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
449 class NavigableString(unicode, PageElement): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
450 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
451 def __new__(cls, value): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
452 """Create a new NavigableString. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
453 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
454 When unpickling a NavigableString, this method is called with |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
455 the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
456 passed in to the superclass's __new__ or the superclass won't know |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
457 how to handle non-ASCII characters. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
458 """ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
459 if isinstance(value, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
460 return unicode.__new__(cls, value) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
461 return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
462 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
463 def __getnewargs__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
464 return (NavigableString.__str__(self),) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
465 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
466 def __getattr__(self, attr): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
467 """text.string gives you text. This is for backwards |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
468 compatibility for Navigable*String, but for CData* it lets you |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
469 get the string without the CData wrapper.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
470 if attr == 'string': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
471 return self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
472 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
473 raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
474 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
475 def __unicode__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
476 return str(self).decode(DEFAULT_OUTPUT_ENCODING) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
477 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
478 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
479 # Substitute outgoing XML entities. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
480 data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
481 if encoding: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
482 return data.encode(encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
483 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
484 return data |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
485 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
486 class CData(NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
487 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
488 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
489 return "<![CDATA[%s]]>" % NavigableString.__str__(self, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
490 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
491 class ProcessingInstruction(NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
492 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
493 output = self |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
494 if "%SOUP-ENCODING%" in output: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
495 output = self.substituteEncoding(output, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
496 return "<?%s?>" % self.toEncoding(output, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
497 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
498 class Comment(NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
499 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
500 return "<!--%s-->" % NavigableString.__str__(self, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
501 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
502 class Declaration(NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
503 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
504 return "<!%s>" % NavigableString.__str__(self, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
505 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
506 class Tag(PageElement): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
507 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
508 """Represents a found HTML tag with its attributes and contents.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
509 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
510 def _convertEntities(self, match): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
511 """Used in a call to re.sub to replace HTML, XML, and numeric |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
512 entities with the appropriate Unicode characters. If HTML |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
513 entities are being converted, any unrecognized entities are |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
514 escaped.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
515 x = match.group(1) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
516 if self.convertHTMLEntities and x in name2codepoint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
517 return unichr(name2codepoint[x]) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
518 elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
519 if self.convertXMLEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
520 return self.XML_ENTITIES_TO_SPECIAL_CHARS[x] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
521 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
522 return u'&%s;' % x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
523 elif len(x) > 0 and x[0] == '#': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
524 # Handle numeric entities |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
525 if len(x) > 1 and x[1] == 'x': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
526 return unichr(int(x[2:], 16)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
527 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
528 return unichr(int(x[1:])) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
529 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
530 elif self.escapeUnrecognizedEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
531 return u'&%s;' % x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
532 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
533 return u'&%s;' % x |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
534 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
535 def __init__(self, parser, name, attrs=None, parent=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
536 previous=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
537 "Basic constructor." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
538 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
539 # We don't actually store the parser object: that lets extracted |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
540 # chunks be garbage-collected |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
541 self.parserClass = parser.__class__ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
542 self.isSelfClosing = parser.isSelfClosingTag(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
543 self.name = name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
544 if attrs is None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
545 attrs = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
546 elif isinstance(attrs, dict): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
547 attrs = attrs.items() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
548 self.attrs = attrs |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
549 self.contents = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
550 self.setup(parent, previous) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
551 self.hidden = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
552 self.containsSubstitutions = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
553 self.convertHTMLEntities = parser.convertHTMLEntities |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
554 self.convertXMLEntities = parser.convertXMLEntities |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
555 self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
556 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
557 # Convert any HTML, XML, or numeric entities in the attribute values. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
558 convert = lambda(k, val): (k, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
559 re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
560 self._convertEntities, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
561 val)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
562 self.attrs = map(convert, self.attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
563 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
564 def getString(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
565 if (len(self.contents) == 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
566 and isinstance(self.contents[0], NavigableString)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
567 return self.contents[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
568 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
569 def setString(self, string): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
570 """Replace the contents of the tag with a string""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
571 self.clear() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
572 self.append(string) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
573 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
574 string = property(getString, setString) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
575 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
576 def getText(self, separator=u""): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
577 if not len(self.contents): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
578 return u"" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
579 stopNode = self._lastRecursiveChild().next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
580 strings = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
581 current = self.contents[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
582 while current is not stopNode: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
583 if isinstance(current, NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
584 strings.append(current.strip()) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
585 current = current.next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
586 return separator.join(strings) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
587 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
588 text = property(getText) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
589 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
590 def get(self, key, default=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
591 """Returns the value of the 'key' attribute for the tag, or |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
592 the value given for 'default' if it doesn't have that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
593 attribute.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
594 return self._getAttrMap().get(key, default) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
595 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
596 def clear(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
597 """Extract all children.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
598 for child in self.contents[:]: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
599 child.extract() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
600 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
601 def index(self, element): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
602 for i, child in enumerate(self.contents): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
603 if child is element: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
604 return i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
605 raise ValueError("Tag.index: element not in tag") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
606 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
607 def has_key(self, key): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
608 return self._getAttrMap().has_key(key) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
609 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
610 def __getitem__(self, key): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
611 """tag[key] returns the value of the 'key' attribute for the tag, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
612 and throws an exception if it's not there.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
613 return self._getAttrMap()[key] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
614 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
615 def __iter__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
616 "Iterating over a tag iterates over its contents." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
617 return iter(self.contents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
618 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
619 def __len__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
620 "The length of a tag is the length of its list of contents." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
621 return len(self.contents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
622 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
623 def __contains__(self, x): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
624 return x in self.contents |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
625 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
626 def __nonzero__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
627 "A tag is non-None even if it has no contents." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
628 return True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
629 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
630 def __setitem__(self, key, value): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
631 """Setting tag[key] sets the value of the 'key' attribute for the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
632 tag.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
633 self._getAttrMap() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
634 self.attrMap[key] = value |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
635 found = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
636 for i in range(0, len(self.attrs)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
637 if self.attrs[i][0] == key: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
638 self.attrs[i] = (key, value) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
639 found = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
640 if not found: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
641 self.attrs.append((key, value)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
642 self._getAttrMap()[key] = value |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
643 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
644 def __delitem__(self, key): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
645 "Deleting tag[key] deletes all 'key' attributes for the tag." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
646 for item in self.attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
647 if item[0] == key: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
648 self.attrs.remove(item) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
649 #We don't break because bad HTML can define the same |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
650 #attribute multiple times. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
651 self._getAttrMap() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
652 if self.attrMap.has_key(key): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
653 del self.attrMap[key] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
654 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
655 def __call__(self, *args, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
656 """Calling a tag like a function is the same as calling its |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
657 findAll() method. Eg. tag('a') returns a list of all the A tags |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
658 found within this tag.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
659 return apply(self.findAll, args, kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
660 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
661 def __getattr__(self, tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
662 #print "Getattr %s.%s" % (self.__class__, tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
663 if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
664 return self.find(tag[:-3]) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
665 elif tag.find('__') != 0: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
666 return self.find(tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
667 raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
668 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
669 def __eq__(self, other): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
670 """Returns true iff this tag has the same name, the same attributes, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
671 and the same contents (recursively) as the given tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
672 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
673 NOTE: right now this will return false if two tags have the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
674 same attributes in a different order. Should this be fixed?""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
675 if other is self: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
676 return True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
677 if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
678 return False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
679 for i in range(0, len(self.contents)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
680 if self.contents[i] != other.contents[i]: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
681 return False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
682 return True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
683 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
684 def __ne__(self, other): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
685 """Returns true iff this tag is not identical to the other tag, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
686 as defined in __eq__.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
687 return not self == other |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
688 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
689 def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
690 """Renders this tag as a string.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
691 return self.__str__(encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
692 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
693 def __unicode__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
694 return self.__str__(None) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
695 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
696 def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
697 prettyPrint=False, indentLevel=0): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
698 """Returns a string or Unicode representation of this tag and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
699 its contents. To get Unicode, pass None for encoding. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
700 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
701 NOTE: since Python's HTML parser consumes whitespace, this |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
702 method is not certain to reproduce the whitespace present in |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
703 the original string.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
704 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
705 encodedName = self.toEncoding(self.name, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
706 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
707 attrs = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
708 if self.attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
709 for key, val in self.attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
710 fmt = '%s="%s"' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
711 if isinstance(val, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
712 if self.containsSubstitutions and '%SOUP-ENCODING%' in val: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
713 val = self.substituteEncoding(val, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
714 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
715 # The attribute value either: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
716 # |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
717 # * Contains no embedded double quotes or single quotes. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
718 # No problem: we enclose it in double quotes. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
719 # * Contains embedded single quotes. No problem: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
720 # double quotes work here too. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
721 # * Contains embedded double quotes. No problem: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
722 # we enclose it in single quotes. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
723 # * Embeds both single _and_ double quotes. This |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
724 # can't happen naturally, but it can happen if |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
725 # you modify an attribute value after parsing |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
726 # the document. Now we have a bit of a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
727 # problem. We solve it by enclosing the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
728 # attribute in single quotes, and escaping any |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
729 # embedded single quotes to XML entities. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
730 if '"' in val: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
731 fmt = "%s='%s'" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
732 if "'" in val: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
733 # TODO: replace with apos when |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
734 # appropriate. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
735 val = val.replace("'", "&squot;") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
736 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
737 # Now we're okay w/r/t quotes. But the attribute |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
738 # value might also contain angle brackets, or |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
739 # ampersands that aren't part of entities. We need |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
740 # to escape those to XML entities too. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
741 val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
742 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
743 attrs.append(fmt % (self.toEncoding(key, encoding), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
744 self.toEncoding(val, encoding))) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
745 close = '' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
746 closeTag = '' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
747 if self.isSelfClosing: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
748 close = ' /' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
749 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
750 closeTag = '</%s>' % encodedName |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
751 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
752 indentTag, indentContents = 0, 0 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
753 if prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
754 indentTag = indentLevel |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
755 space = (' ' * (indentTag-1)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
756 indentContents = indentTag + 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
757 contents = self.renderContents(encoding, prettyPrint, indentContents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
758 if self.hidden: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
759 s = contents |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
760 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
761 s = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
762 attributeString = '' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
763 if attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
764 attributeString = ' ' + ' '.join(attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
765 if prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
766 s.append(space) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
767 s.append('<%s%s%s>' % (encodedName, attributeString, close)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
768 if prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
769 s.append("\n") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
770 s.append(contents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
771 if prettyPrint and contents and contents[-1] != "\n": |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
772 s.append("\n") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
773 if prettyPrint and closeTag: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
774 s.append(space) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
775 s.append(closeTag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
776 if prettyPrint and closeTag and self.nextSibling: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
777 s.append("\n") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
778 s = ''.join(s) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
779 return s |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
780 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
781 def decompose(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
782 """Recursively destroys the contents of this tree.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
783 self.extract() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
784 if len(self.contents) == 0: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
785 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
786 current = self.contents[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
787 while current is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
788 next = current.next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
789 if isinstance(current, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
790 del current.contents[:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
791 current.parent = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
792 current.previous = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
793 current.previousSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
794 current.next = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
795 current.nextSibling = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
796 current = next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
797 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
798 def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
799 return self.__str__(encoding, True) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
800 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
801 def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
802 prettyPrint=False, indentLevel=0): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
803 """Renders the contents of this tag as a string in the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
804 encoding. If encoding is None, returns a Unicode string..""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
805 s=[] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
806 for c in self: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
807 text = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
808 if isinstance(c, NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
809 text = c.__str__(encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
810 elif isinstance(c, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
811 s.append(c.__str__(encoding, prettyPrint, indentLevel)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
812 if text and prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
813 text = text.strip() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
814 if text: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
815 if prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
816 s.append(" " * (indentLevel-1)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
817 s.append(text) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
818 if prettyPrint: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
819 s.append("\n") |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
820 return ''.join(s) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
821 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
822 #Soup methods |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
823 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
824 def find(self, name=None, attrs={}, recursive=True, text=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
825 **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
826 """Return only the first child of this Tag matching the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
827 criteria.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
828 r = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
829 l = self.findAll(name, attrs, recursive, text, 1, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
830 if l: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
831 r = l[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
832 return r |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
833 findChild = find |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
834 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
835 def findAll(self, name=None, attrs={}, recursive=True, text=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
836 limit=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
837 """Extracts a list of Tag objects that match the given |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
838 criteria. You can specify the name of the Tag and any |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
839 attributes you want the Tag to have. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
840 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
841 The value of a key-value pair in the 'attrs' map can be a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
842 string, a list of strings, a regular expression object, or a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
843 callable that takes a string and returns whether or not the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
844 string matches for some custom definition of 'matches'. The |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
845 same is true of the tag name.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
846 generator = self.recursiveChildGenerator |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
847 if not recursive: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
848 generator = self.childGenerator |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
849 return self._findAll(name, attrs, text, limit, generator, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
850 findChildren = findAll |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
851 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
852 # Pre-3.x compatibility methods |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
853 first = find |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
854 fetch = findAll |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
855 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
856 def fetchText(self, text=None, recursive=True, limit=None): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
857 return self.findAll(text=text, recursive=recursive, limit=limit) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
858 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
859 def firstText(self, text=None, recursive=True): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
860 return self.find(text=text, recursive=recursive) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
861 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
862 #Private methods |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
863 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
864 def _getAttrMap(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
865 """Initializes a map representation of this tag's attributes, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
866 if not already initialized.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
867 if not getattr(self, 'attrMap'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
868 self.attrMap = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
869 for (key, value) in self.attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
870 self.attrMap[key] = value |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
871 return self.attrMap |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
872 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
873 #Generator methods |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
874 def childGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
875 # Just use the iterator from the contents |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
876 return iter(self.contents) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
877 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
878 def recursiveChildGenerator(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
879 if not len(self.contents): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
880 raise StopIteration |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
881 stopNode = self._lastRecursiveChild().next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
882 current = self.contents[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
883 while current is not stopNode: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
884 yield current |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
885 current = current.next |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
886 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
887 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
888 # Next, a couple classes to represent queries and their results. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
889 class SoupStrainer: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
890 """Encapsulates a number of ways of matching a markup element (tag or |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
891 text).""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
892 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
893 def __init__(self, name=None, attrs={}, text=None, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
894 self.name = name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
895 if isinstance(attrs, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
896 kwargs['class'] = _match_css_class(attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
897 attrs = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
898 if kwargs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
899 if attrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
900 attrs = attrs.copy() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
901 attrs.update(kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
902 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
903 attrs = kwargs |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
904 self.attrs = attrs |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
905 self.text = text |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
906 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
907 def __str__(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
908 if self.text: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
909 return self.text |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
910 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
911 return "%s|%s" % (self.name, self.attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
912 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
913 def searchTag(self, markupName=None, markupAttrs={}): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
914 found = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
915 markup = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
916 if isinstance(markupName, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
917 markup = markupName |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
918 markupAttrs = markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
919 callFunctionWithTagData = callable(self.name) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
920 and not isinstance(markupName, Tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
921 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
922 if (not self.name) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
923 or callFunctionWithTagData \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
924 or (markup and self._matches(markup, self.name)) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
925 or (not markup and self._matches(markupName, self.name)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
926 if callFunctionWithTagData: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
927 match = self.name(markupName, markupAttrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
928 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
929 match = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
930 markupAttrMap = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
931 for attr, matchAgainst in self.attrs.items(): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
932 if not markupAttrMap: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
933 if hasattr(markupAttrs, 'get'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
934 markupAttrMap = markupAttrs |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
935 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
936 markupAttrMap = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
937 for k,v in markupAttrs: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
938 markupAttrMap[k] = v |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
939 attrValue = markupAttrMap.get(attr) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
940 if not self._matches(attrValue, matchAgainst): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
941 match = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
942 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
943 if match: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
944 if markup: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
945 found = markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
946 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
947 found = markupName |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
948 return found |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
949 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
950 def search(self, markup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
951 #print 'looking for %s in %s' % (self, markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
952 found = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
953 # If given a list of items, scan it for a text element that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
954 # matches. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
955 if hasattr(markup, "__iter__") \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
956 and not isinstance(markup, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
957 for element in markup: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
958 if isinstance(element, NavigableString) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
959 and self.search(element): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
960 found = element |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
961 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
962 # If it's a Tag, make sure its name or attributes match. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
963 # Don't bother with Tags if we're searching for text. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
964 elif isinstance(markup, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
965 if not self.text: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
966 found = self.searchTag(markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
967 # If it's text, make sure the text matches. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
968 elif isinstance(markup, NavigableString) or \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
969 isinstance(markup, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
970 if self._matches(markup, self.text): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
971 found = markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
972 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
973 raise Exception, "I don't know how to match against a %s" \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
974 % markup.__class__ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
975 return found |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
976 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
977 def _matches(self, markup, matchAgainst): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
978 #print "Matching %s against %s" % (markup, matchAgainst) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
979 result = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
980 if matchAgainst is True: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
981 result = markup is not None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
982 elif callable(matchAgainst): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
983 result = matchAgainst(markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
984 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
985 #Custom match methods take the tag as an argument, but all |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
986 #other ways of matching match the tag name as a string. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
987 if isinstance(markup, Tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
988 markup = markup.name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
989 if markup and not isinstance(markup, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
990 markup = unicode(markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
991 #Now we know that chunk is either a string, or None. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
992 if hasattr(matchAgainst, 'match'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
993 # It's a regexp object. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
994 result = markup and matchAgainst.search(markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
995 elif hasattr(matchAgainst, '__iter__'): # list-like |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
996 result = markup in matchAgainst |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
997 elif hasattr(matchAgainst, 'items'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
998 result = markup.has_key(matchAgainst) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
999 elif matchAgainst and isinstance(markup, basestring): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1000 if isinstance(markup, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1001 matchAgainst = unicode(matchAgainst) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1002 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1003 matchAgainst = str(matchAgainst) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1004 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1005 if not result: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1006 result = matchAgainst == markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1007 return result |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1008 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1009 class ResultSet(list): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1010 """A ResultSet is just a list that keeps track of the SoupStrainer |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1011 that created it.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1012 def __init__(self, source): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1013 list.__init__([]) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1014 self.source = source |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1015 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1016 # Now, some helper functions. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1017 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1018 def buildTagMap(default, *args): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1019 """Turns a list of maps, lists, or scalars into a single map. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1020 Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1021 NESTING_RESET_TAGS maps out of lists and partial maps.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1022 built = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1023 for portion in args: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1024 if hasattr(portion, 'items'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1025 #It's a map. Merge it. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1026 for k,v in portion.items(): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1027 built[k] = v |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1028 elif hasattr(portion, '__iter__'): # is a list |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1029 #It's a list. Map each item to the default. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1030 for k in portion: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1031 built[k] = default |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1032 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1033 #It's a scalar. Map it to the default. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1034 built[portion] = default |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1035 return built |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1036 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1037 # Now, the parser classes. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1038 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1039 class BeautifulStoneSoup(Tag, SGMLParser): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1040 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1041 """This class contains the basic parser and search code. It defines |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1042 a parser that knows nothing about tag behavior except for the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1043 following: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1044 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1045 You can't close a tag without closing all the tags it encloses. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1046 That is, "<foo><bar></foo>" actually means |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1047 "<foo><bar></bar></foo>". |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1048 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1049 [Another possible explanation is "<foo><bar /></foo>", but since |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1050 this class defines no SELF_CLOSING_TAGS, it will never use that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1051 explanation.] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1052 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1053 This class is useful for parsing XML or made-up markup languages, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1054 or when BeautifulSoup makes an assumption counter to what you were |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1055 expecting.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1056 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1057 SELF_CLOSING_TAGS = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1058 NESTABLE_TAGS = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1059 RESET_NESTING_TAGS = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1060 QUOTE_TAGS = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1061 PRESERVE_WHITESPACE_TAGS = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1062 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1063 MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1064 lambda x: x.group(1) + ' />'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1065 (re.compile('<!\s+([^<>]*)>'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1066 lambda x: '<!' + x.group(1) + '>') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1067 ] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1068 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1069 ROOT_TAG_NAME = u'[document]' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1070 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1071 HTML_ENTITIES = "html" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1072 XML_ENTITIES = "xml" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1073 XHTML_ENTITIES = "xhtml" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1074 # TODO: This only exists for backwards-compatibility |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1075 ALL_ENTITIES = XHTML_ENTITIES |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1076 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1077 # Used when determining whether a text node is all whitespace and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1078 # can be replaced with a single space. A text node that contains |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1079 # fancy Unicode spaces (usually non-breaking) should be left |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1080 # alone. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1081 STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, } |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1082 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1083 def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1084 markupMassage=True, smartQuotesTo=XML_ENTITIES, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1085 convertEntities=None, selfClosingTags=None, isHTML=False): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1086 """The Soup object is initialized as the 'root tag', and the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1087 provided markup (which can be a string or a file-like object) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1088 is fed into the underlying parser. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1089 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1090 sgmllib will process most bad HTML, and the BeautifulSoup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1091 class has some tricks for dealing with some HTML that kills |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1092 sgmllib, but Beautiful Soup can nonetheless choke or lose data |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1093 if your data uses self-closing tags or declarations |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1094 incorrectly. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1095 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1096 By default, Beautiful Soup uses regexes to sanitize input, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1097 avoiding the vast majority of these problems. If the problems |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1098 don't apply to you, pass in False for markupMassage, and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1099 you'll get better performance. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1100 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1101 The default parser massage techniques fix the two most common |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1102 instances of invalid HTML that choke sgmllib: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1103 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1104 <br/> (No space between name of closing tag and tag close) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1105 <! --Comment--> (Extraneous whitespace in declaration) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1106 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1107 You can pass in a custom list of (RE object, replace method) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1108 tuples to get Beautiful Soup to scrub your input the way you |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1109 want.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1110 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1111 self.parseOnlyThese = parseOnlyThese |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1112 self.fromEncoding = fromEncoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1113 self.smartQuotesTo = smartQuotesTo |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1114 self.convertEntities = convertEntities |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1115 # Set the rules for how we'll deal with the entities we |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1116 # encounter |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1117 if self.convertEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1118 # It doesn't make sense to convert encoded characters to |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1119 # entities even while you're converting entities to Unicode. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1120 # Just convert it all to Unicode. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1121 self.smartQuotesTo = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1122 if convertEntities == self.HTML_ENTITIES: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1123 self.convertXMLEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1124 self.convertHTMLEntities = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1125 self.escapeUnrecognizedEntities = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1126 elif convertEntities == self.XHTML_ENTITIES: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1127 self.convertXMLEntities = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1128 self.convertHTMLEntities = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1129 self.escapeUnrecognizedEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1130 elif convertEntities == self.XML_ENTITIES: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1131 self.convertXMLEntities = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1132 self.convertHTMLEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1133 self.escapeUnrecognizedEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1134 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1135 self.convertXMLEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1136 self.convertHTMLEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1137 self.escapeUnrecognizedEntities = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1138 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1139 self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1140 SGMLParser.__init__(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1141 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1142 if hasattr(markup, 'read'): # It's a file-type object. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1143 markup = markup.read() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1144 self.markup = markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1145 self.markupMassage = markupMassage |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1146 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1147 self._feed(isHTML=isHTML) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1148 except StopParsing: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1149 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1150 self.markup = None # The markup can now be GCed |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1151 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1152 def convert_charref(self, name): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1153 """This method fixes a bug in Python's SGMLParser.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1154 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1155 n = int(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1156 except ValueError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1157 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1158 if not 0 <= n <= 127 : # ASCII ends at 127, not 255 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1159 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1160 return self.convert_codepoint(n) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1161 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1162 def _feed(self, inDocumentEncoding=None, isHTML=False): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1163 # Convert the document to Unicode. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1164 markup = self.markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1165 if isinstance(markup, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1166 if not hasattr(self, 'originalEncoding'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1167 self.originalEncoding = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1168 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1169 dammit = UnicodeDammit\ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1170 (markup, [self.fromEncoding, inDocumentEncoding], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1171 smartQuotesTo=self.smartQuotesTo, isHTML=isHTML) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1172 markup = dammit.unicode |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1173 self.originalEncoding = dammit.originalEncoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1174 self.declaredHTMLEncoding = dammit.declaredHTMLEncoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1175 if markup: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1176 if self.markupMassage: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1177 if not hasattr(self.markupMassage, "__iter__"): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1178 self.markupMassage = self.MARKUP_MASSAGE |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1179 for fix, m in self.markupMassage: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1180 markup = fix.sub(m, markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1181 # TODO: We get rid of markupMassage so that the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1182 # soup object can be deepcopied later on. Some |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1183 # Python installations can't copy regexes. If anyone |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1184 # was relying on the existence of markupMassage, this |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1185 # might cause problems. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1186 del(self.markupMassage) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1187 self.reset() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1188 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1189 SGMLParser.feed(self, markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1190 # Close out any unfinished strings and close all the open tags. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1191 self.endData() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1192 while self.currentTag.name != self.ROOT_TAG_NAME: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1193 self.popTag() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1194 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1195 def __getattr__(self, methodName): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1196 """This method routes method call requests to either the SGMLParser |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1197 superclass or the Tag superclass, depending on the method name.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1198 #print "__getattr__ called on %s.%s" % (self.__class__, methodName) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1199 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1200 if methodName.startswith('start_') or methodName.startswith('end_') \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1201 or methodName.startswith('do_'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1202 return SGMLParser.__getattr__(self, methodName) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1203 elif not methodName.startswith('__'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1204 return Tag.__getattr__(self, methodName) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1205 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1206 raise AttributeError |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1207 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1208 def isSelfClosingTag(self, name): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1209 """Returns true iff the given string is the name of a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1210 self-closing tag according to this parser.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1211 return self.SELF_CLOSING_TAGS.has_key(name) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1212 or self.instanceSelfClosingTags.has_key(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1213 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1214 def reset(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1215 Tag.__init__(self, self, self.ROOT_TAG_NAME) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1216 self.hidden = 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1217 SGMLParser.reset(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1218 self.currentData = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1219 self.currentTag = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1220 self.tagStack = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1221 self.quoteStack = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1222 self.pushTag(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1223 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1224 def popTag(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1225 tag = self.tagStack.pop() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1226 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1227 #print "Pop", tag.name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1228 if self.tagStack: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1229 self.currentTag = self.tagStack[-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1230 return self.currentTag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1231 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1232 def pushTag(self, tag): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1233 #print "Push", tag.name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1234 if self.currentTag: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1235 self.currentTag.contents.append(tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1236 self.tagStack.append(tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1237 self.currentTag = self.tagStack[-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1238 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1239 def endData(self, containerClass=NavigableString): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1240 if self.currentData: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1241 currentData = u''.join(self.currentData) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1242 if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1243 not set([tag.name for tag in self.tagStack]).intersection( |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1244 self.PRESERVE_WHITESPACE_TAGS)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1245 if '\n' in currentData: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1246 currentData = '\n' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1247 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1248 currentData = ' ' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1249 self.currentData = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1250 if self.parseOnlyThese and len(self.tagStack) <= 1 and \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1251 (not self.parseOnlyThese.text or \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1252 not self.parseOnlyThese.search(currentData)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1253 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1254 o = containerClass(currentData) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1255 o.setup(self.currentTag, self.previous) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1256 if self.previous: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1257 self.previous.next = o |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1258 self.previous = o |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1259 self.currentTag.contents.append(o) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1260 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1261 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1262 def _popToTag(self, name, inclusivePop=True): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1263 """Pops the tag stack up to and including the most recent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1264 instance of the given tag. If inclusivePop is false, pops the tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1265 stack up to but *not* including the most recent instqance of |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1266 the given tag.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1267 #print "Popping to %s" % name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1268 if name == self.ROOT_TAG_NAME: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1269 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1270 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1271 numPops = 0 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1272 mostRecentTag = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1273 for i in range(len(self.tagStack)-1, 0, -1): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1274 if name == self.tagStack[i].name: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1275 numPops = len(self.tagStack)-i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1276 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1277 if not inclusivePop: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1278 numPops = numPops - 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1279 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1280 for i in range(0, numPops): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1281 mostRecentTag = self.popTag() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1282 return mostRecentTag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1283 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1284 def _smartPop(self, name): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1285 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1286 """We need to pop up to the previous tag of this type, unless |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1287 one of this tag's nesting reset triggers comes between this |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1288 tag and the previous tag of this type, OR unless this tag is a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1289 generic nesting trigger and another generic nesting trigger |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1290 comes between this tag and the previous tag of this type. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1291 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1292 Examples: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1293 <p>Foo<b>Bar *<p>* should pop to 'p', not 'b'. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1294 <p>Foo<table>Bar *<p>* should pop to 'table', not 'p'. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1295 <p>Foo<table><tr>Bar *<p>* should pop to 'tr', not 'p'. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1296 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1297 <li><ul><li> *<li>* should pop to 'ul', not the first 'li'. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1298 <tr><table><tr> *<tr>* should pop to 'table', not the first 'tr' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1299 <td><tr><td> *<td>* should pop to 'tr', not the first 'td' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1300 """ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1301 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1302 nestingResetTriggers = self.NESTABLE_TAGS.get(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1303 isNestable = nestingResetTriggers != None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1304 isResetNesting = self.RESET_NESTING_TAGS.has_key(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1305 popTo = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1306 inclusive = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1307 for i in range(len(self.tagStack)-1, 0, -1): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1308 p = self.tagStack[i] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1309 if (not p or p.name == name) and not isNestable: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1310 #Non-nestable tags get popped to the top or to their |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1311 #last occurance. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1312 popTo = name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1313 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1314 if (nestingResetTriggers is not None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1315 and p.name in nestingResetTriggers) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1316 or (nestingResetTriggers is None and isResetNesting |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1317 and self.RESET_NESTING_TAGS.has_key(p.name)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1318 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1319 #If we encounter one of the nesting reset triggers |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1320 #peculiar to this tag, or we encounter another tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1321 #that causes nesting to reset, pop up to but not |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1322 #including that tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1323 popTo = p.name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1324 inclusive = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1325 break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1326 p = p.parent |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1327 if popTo: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1328 self._popToTag(popTo, inclusive) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1329 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1330 def unknown_starttag(self, name, attrs, selfClosing=0): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1331 #print "Start tag %s: %s" % (name, attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1332 if self.quoteStack: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1333 #This is not a real tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1334 #print "<%s> is not real!" % name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1335 attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs]) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1336 self.handle_data('<%s%s>' % (name, attrs)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1337 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1338 self.endData() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1339 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1340 if not self.isSelfClosingTag(name) and not selfClosing: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1341 self._smartPop(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1342 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1343 if self.parseOnlyThese and len(self.tagStack) <= 1 \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1344 and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1345 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1346 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1347 tag = Tag(self, name, attrs, self.currentTag, self.previous) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1348 if self.previous: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1349 self.previous.next = tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1350 self.previous = tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1351 self.pushTag(tag) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1352 if selfClosing or self.isSelfClosingTag(name): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1353 self.popTag() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1354 if name in self.QUOTE_TAGS: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1355 #print "Beginning quote (%s)" % name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1356 self.quoteStack.append(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1357 self.literal = 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1358 return tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1359 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1360 def unknown_endtag(self, name): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1361 #print "End tag %s" % name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1362 if self.quoteStack and self.quoteStack[-1] != name: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1363 #This is not a real end tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1364 #print "</%s> is not real!" % name |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1365 self.handle_data('</%s>' % name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1366 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1367 self.endData() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1368 self._popToTag(name) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1369 if self.quoteStack and self.quoteStack[-1] == name: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1370 self.quoteStack.pop() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1371 self.literal = (len(self.quoteStack) > 0) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1372 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1373 def handle_data(self, data): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1374 self.currentData.append(data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1375 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1376 def _toStringSubclass(self, text, subclass): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1377 """Adds a certain piece of text to the tree as a NavigableString |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1378 subclass.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1379 self.endData() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1380 self.handle_data(text) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1381 self.endData(subclass) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1382 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1383 def handle_pi(self, text): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1384 """Handle a processing instruction as a ProcessingInstruction |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1385 object, possibly one with a %SOUP-ENCODING% slot into which an |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1386 encoding will be plugged later.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1387 if text[:3] == "xml": |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1388 text = u"xml version='1.0' encoding='%SOUP-ENCODING%'" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1389 self._toStringSubclass(text, ProcessingInstruction) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1390 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1391 def handle_comment(self, text): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1392 "Handle comments as Comment objects." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1393 self._toStringSubclass(text, Comment) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1394 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1395 def handle_charref(self, ref): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1396 "Handle character references as data." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1397 if self.convertEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1398 data = unichr(int(ref)) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1399 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1400 data = '&#%s;' % ref |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1401 self.handle_data(data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1402 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1403 def handle_entityref(self, ref): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1404 """Handle entity references as data, possibly converting known |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1405 HTML and/or XML entity references to the corresponding Unicode |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1406 characters.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1407 data = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1408 if self.convertHTMLEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1409 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1410 data = unichr(name2codepoint[ref]) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1411 except KeyError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1412 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1413 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1414 if not data and self.convertXMLEntities: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1415 data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1416 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1417 if not data and self.convertHTMLEntities and \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1418 not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1419 # TODO: We've got a problem here. We're told this is |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1420 # an entity reference, but it's not an XML entity |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1421 # reference or an HTML entity reference. Nonetheless, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1422 # the logical thing to do is to pass it through as an |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1423 # unrecognized entity reference. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1424 # |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1425 # Except: when the input is "&carol;" this function |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1426 # will be called with input "carol". When the input is |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1427 # "AT&T", this function will be called with input |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1428 # "T". We have no way of knowing whether a semicolon |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1429 # was present originally, so we don't know whether |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1430 # this is an unknown entity or just a misplaced |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1431 # ampersand. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1432 # |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1433 # The more common case is a misplaced ampersand, so I |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1434 # escape the ampersand and omit the trailing semicolon. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1435 data = "&%s" % ref |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1436 if not data: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1437 # This case is different from the one above, because we |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1438 # haven't already gone through a supposedly comprehensive |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1439 # mapping of entities to Unicode characters. We might not |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1440 # have gone through any mapping at all. So the chances are |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1441 # very high that this is a real entity, and not a |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1442 # misplaced ampersand. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1443 data = "&%s;" % ref |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1444 self.handle_data(data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1445 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1446 def handle_decl(self, data): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1447 "Handle DOCTYPEs and the like as Declaration objects." |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1448 self._toStringSubclass(data, Declaration) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1449 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1450 def parse_declaration(self, i): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1451 """Treat a bogus SGML declaration as raw data. Treat a CDATA |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1452 declaration as a CData object.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1453 j = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1454 if self.rawdata[i:i+9] == '<![CDATA[': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1455 k = self.rawdata.find(']]>', i) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1456 if k == -1: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1457 k = len(self.rawdata) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1458 data = self.rawdata[i+9:k] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1459 j = k+3 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1460 self._toStringSubclass(data, CData) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1461 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1462 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1463 j = SGMLParser.parse_declaration(self, i) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1464 except SGMLParseError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1465 toHandle = self.rawdata[i:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1466 self.handle_data(toHandle) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1467 j = i + len(toHandle) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1468 return j |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1469 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1470 class BeautifulSoup(BeautifulStoneSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1471 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1472 """This parser knows the following facts about HTML: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1473 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1474 * Some tags have no closing tag and should be interpreted as being |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1475 closed as soon as they are encountered. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1476 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1477 * The text inside some tags (ie. 'script') may contain tags which |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1478 are not really part of the document and which should be parsed |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1479 as text, not tags. If you want to parse the text as tags, you can |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1480 always fetch it and parse it explicitly. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1481 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1482 * Tag nesting rules: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1483 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1484 Most tags can't be nested at all. For instance, the occurance of |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1485 a <p> tag should implicitly close the previous <p> tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1486 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1487 <p>Para1<p>Para2 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1488 should be transformed into: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1489 <p>Para1</p><p>Para2 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1490 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1491 Some tags can be nested arbitrarily. For instance, the occurance |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1492 of a <blockquote> tag should _not_ implicitly close the previous |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1493 <blockquote> tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1494 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1495 Alice said: <blockquote>Bob said: <blockquote>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1496 should NOT be transformed into: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1497 Alice said: <blockquote>Bob said: </blockquote><blockquote>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1498 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1499 Some tags can be nested, but the nesting is reset by the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1500 interposition of other tags. For instance, a <tr> tag should |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1501 implicitly close the previous <tr> tag within the same <table>, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1502 but not close a <tr> tag in another table. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1503 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1504 <table><tr>Blah<tr>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1505 should be transformed into: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1506 <table><tr>Blah</tr><tr>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1507 but, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1508 <tr>Blah<table><tr>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1509 should NOT be transformed into |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1510 <tr>Blah<table></tr><tr>Blah |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1511 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1512 Differing assumptions about tag nesting rules are a major source |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1513 of problems with the BeautifulSoup class. If BeautifulSoup is not |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1514 treating as nestable a tag your page author treats as nestable, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1515 try ICantBelieveItsBeautifulSoup, MinimalSoup, or |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1516 BeautifulStoneSoup before writing your own subclass.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1517 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1518 def __init__(self, *args, **kwargs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1519 if not kwargs.has_key('smartQuotesTo'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1520 kwargs['smartQuotesTo'] = self.HTML_ENTITIES |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1521 kwargs['isHTML'] = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1522 BeautifulStoneSoup.__init__(self, *args, **kwargs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1523 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1524 SELF_CLOSING_TAGS = buildTagMap(None, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1525 ('br' , 'hr', 'input', 'img', 'meta', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1526 'spacer', 'link', 'frame', 'base', 'col')) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1527 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1528 PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1529 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1530 QUOTE_TAGS = {'script' : None, 'textarea' : None} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1531 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1532 #According to the HTML standard, each of these inline tags can |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1533 #contain another tag of the same type. Furthermore, it's common |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1534 #to actually use these tags this way. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1535 NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1536 'center') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1537 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1538 #According to the HTML standard, these block tags can contain |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1539 #another tag of the same type. Furthermore, it's common |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1540 #to actually use these tags this way. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1541 NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1542 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1543 #Lists can contain other lists, but there are restrictions. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1544 NESTABLE_LIST_TAGS = { 'ol' : [], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1545 'ul' : [], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1546 'li' : ['ul', 'ol'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1547 'dl' : [], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1548 'dd' : ['dl'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1549 'dt' : ['dl'] } |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1550 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1551 #Tables can contain other tables, but there are restrictions. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1552 NESTABLE_TABLE_TAGS = {'table' : [], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1553 'tr' : ['table', 'tbody', 'tfoot', 'thead'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1554 'td' : ['tr'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1555 'th' : ['tr'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1556 'thead' : ['table'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1557 'tbody' : ['table'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1558 'tfoot' : ['table'], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1559 } |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1560 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1561 NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1562 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1563 #If one of these tags is encountered, all tags up to the next tag of |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1564 #this type are popped. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1565 RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1566 NON_NESTABLE_BLOCK_TAGS, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1567 NESTABLE_LIST_TAGS, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1568 NESTABLE_TABLE_TAGS) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1569 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1570 NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1571 NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1572 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1573 # Used to detect the charset in a META tag; see start_meta |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1574 CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1575 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1576 def start_meta(self, attrs): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1577 """Beautiful Soup can detect a charset included in a META tag, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1578 try to convert the document to that charset, and re-parse the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1579 document from the beginning.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1580 httpEquiv = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1581 contentType = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1582 contentTypeIndex = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1583 tagNeedsEncodingSubstitution = False |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1584 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1585 for i in range(0, len(attrs)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1586 key, value = attrs[i] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1587 key = key.lower() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1588 if key == 'http-equiv': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1589 httpEquiv = value |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1590 elif key == 'content': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1591 contentType = value |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1592 contentTypeIndex = i |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1593 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1594 if httpEquiv and contentType: # It's an interesting meta tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1595 match = self.CHARSET_RE.search(contentType) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1596 if match: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1597 if (self.declaredHTMLEncoding is not None or |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1598 self.originalEncoding == self.fromEncoding): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1599 # An HTML encoding was sniffed while converting |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1600 # the document to Unicode, or an HTML encoding was |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1601 # sniffed during a previous pass through the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1602 # document, or an encoding was specified |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1603 # explicitly and it worked. Rewrite the meta tag. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1604 def rewrite(match): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1605 return match.group(1) + "%SOUP-ENCODING%" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1606 newAttr = self.CHARSET_RE.sub(rewrite, contentType) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1607 attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1608 newAttr) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1609 tagNeedsEncodingSubstitution = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1610 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1611 # This is our first pass through the document. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1612 # Go through it again with the encoding information. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1613 newCharset = match.group(3) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1614 if newCharset and newCharset != self.originalEncoding: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1615 self.declaredHTMLEncoding = newCharset |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1616 self._feed(self.declaredHTMLEncoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1617 raise StopParsing |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1618 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1619 tag = self.unknown_starttag("meta", attrs) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1620 if tag and tagNeedsEncodingSubstitution: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1621 tag.containsSubstitutions = True |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1622 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1623 class StopParsing(Exception): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1624 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1625 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1626 class ICantBelieveItsBeautifulSoup(BeautifulSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1627 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1628 """The BeautifulSoup class is oriented towards skipping over |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1629 common HTML errors like unclosed tags. However, sometimes it makes |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1630 errors of its own. For instance, consider this fragment: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1631 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1632 <b>Foo<b>Bar</b></b> |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1633 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1634 This is perfectly valid (if bizarre) HTML. However, the |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1635 BeautifulSoup class will implicitly close the first b tag when it |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1636 encounters the second 'b'. It will think the author wrote |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1637 "<b>Foo<b>Bar", and didn't close the first 'b' tag, because |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1638 there's no real-world reason to bold something that's already |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1639 bold. When it encounters '</b></b>' it will close two more 'b' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1640 tags, for a grand total of three tags closed instead of two. This |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1641 can throw off the rest of your document structure. The same is |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1642 true of a number of other tags, listed below. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1643 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1644 It's much more common for someone to forget to close a 'b' tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1645 than to actually use nested 'b' tags, and the BeautifulSoup class |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1646 handles the common case. This class handles the not-co-common |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1647 case: where you can't believe someone wrote what they did, but |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1648 it's valid HTML and BeautifulSoup screwed up by assuming it |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1649 wouldn't be.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1650 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1651 I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1652 ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1653 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1654 'big') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1655 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1656 I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1657 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1658 NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1659 I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1660 I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1661 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1662 class MinimalSoup(BeautifulSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1663 """The MinimalSoup class is for parsing HTML that contains |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1664 pathologically bad markup. It makes no assumptions about tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1665 nesting, but it does know which tags are self-closing, that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1666 <script> tags contain Javascript and should not be parsed, that |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1667 META tags may contain encoding information, and so on. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1668 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1669 This also makes it better for subclassing than BeautifulStoneSoup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1670 or BeautifulSoup.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1671 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1672 RESET_NESTING_TAGS = buildTagMap('noscript') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1673 NESTABLE_TAGS = {} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1674 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1675 class BeautifulSOAP(BeautifulStoneSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1676 """This class will push a tag with only a single string child into |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1677 the tag's parent as an attribute. The attribute's name is the tag |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1678 name, and the value is the string child. An example should give |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1679 the flavor of the change: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1680 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1681 <foo><bar>baz</bar></foo> |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1682 => |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1683 <foo bar="baz"><bar>baz</bar></foo> |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1684 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1685 You can then access fooTag['bar'] instead of fooTag.barTag.string. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1686 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1687 This is, of course, useful for scraping structures that tend to |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1688 use subelements instead of attributes, such as SOAP messages. Note |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1689 that it modifies its input, so don't print the modified version |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1690 out. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1691 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1692 I'm not sure how many people really want to use this class; let me |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1693 know if you do. Mainly I like the name.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1694 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1695 def popTag(self): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1696 if len(self.tagStack) > 1: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1697 tag = self.tagStack[-1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1698 parent = self.tagStack[-2] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1699 parent._getAttrMap() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1700 if (isinstance(tag, Tag) and len(tag.contents) == 1 and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1701 isinstance(tag.contents[0], NavigableString) and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1702 not parent.attrMap.has_key(tag.name)): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1703 parent[tag.name] = tag.contents[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1704 BeautifulStoneSoup.popTag(self) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1705 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1706 #Enterprise class names! It has come to our attention that some people |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1707 #think the names of the Beautiful Soup parser classes are too silly |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1708 #and "unprofessional" for use in enterprise screen-scraping. We feel |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1709 #your pain! For such-minded folk, the Beautiful Soup Consortium And |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1710 #All-Night Kosher Bakery recommends renaming this file to |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1711 #"RobustParser.py" (or, in cases of extreme enterprisiness, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1712 #"RobustParserBeanInterface.class") and using the following |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1713 #enterprise-friendly class aliases: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1714 class RobustXMLParser(BeautifulStoneSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1715 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1716 class RobustHTMLParser(BeautifulSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1717 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1718 class RobustWackAssHTMLParser(ICantBelieveItsBeautifulSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1719 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1720 class RobustInsanelyWackAssHTMLParser(MinimalSoup): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1721 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1722 class SimplifyingSOAPParser(BeautifulSOAP): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1723 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1724 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1725 ###################################################### |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1726 # |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1727 # Bonus library: Unicode, Dammit |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1728 # |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1729 # This class forces XML data into a standard format (usually to UTF-8 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1730 # or Unicode). It is heavily based on code from Mark Pilgrim's |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1731 # Universal Feed Parser. It does not rewrite the XML or HTML to |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1732 # reflect a new encoding: that happens in BeautifulStoneSoup.handle_pi |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1733 # (XML) and BeautifulSoup.start_meta (HTML). |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1734 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1735 # Autodetects character encodings. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1736 # Download from http://chardet.feedparser.org/ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1737 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1738 import chardet |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1739 # import chardet.constants |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1740 # chardet.constants._debug = 1 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1741 except ImportError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1742 chardet = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1743 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1744 # cjkcodecs and iconv_codec make Python know about more character encodings. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1745 # Both are available from http://cjkpython.i18n.org/ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1746 # They're built in if you use Python 2.4. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1747 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1748 import cjkcodecs.aliases |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1749 except ImportError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1750 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1751 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1752 import iconv_codec |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1753 except ImportError: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1754 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1755 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1756 class UnicodeDammit: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1757 """A class for detecting the encoding of a *ML document and |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1758 converting it to a Unicode string. If the source encoding is |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1759 windows-1252, can replace MS smart quotes with their HTML or XML |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1760 equivalents.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1761 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1762 # This dictionary maps commonly seen values for "charset" in HTML |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1763 # meta tags to the corresponding Python codec names. It only covers |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1764 # values that aren't in Python's aliases and can't be determined |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1765 # by the heuristics in find_codec. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1766 CHARSET_ALIASES = { "macintosh" : "mac-roman", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1767 "x-sjis" : "shift-jis" } |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1768 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1769 def __init__(self, markup, overrideEncodings=[], |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1770 smartQuotesTo='xml', isHTML=False): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1771 self.declaredHTMLEncoding = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1772 self.markup, documentEncoding, sniffedEncoding = \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1773 self._detectEncoding(markup, isHTML) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1774 self.smartQuotesTo = smartQuotesTo |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1775 self.triedEncodings = [] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1776 if markup == '' or isinstance(markup, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1777 self.originalEncoding = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1778 self.unicode = unicode(markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1779 return |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1780 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1781 u = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1782 for proposedEncoding in overrideEncodings: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1783 u = self._convertFrom(proposedEncoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1784 if u: break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1785 if not u: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1786 for proposedEncoding in (documentEncoding, sniffedEncoding): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1787 u = self._convertFrom(proposedEncoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1788 if u: break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1789 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1790 # If no luck and we have auto-detection library, try that: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1791 if not u and chardet and not isinstance(self.markup, unicode): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1792 u = self._convertFrom(chardet.detect(self.markup)['encoding']) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1793 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1794 # As a last resort, try utf-8 and windows-1252: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1795 if not u: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1796 for proposed_encoding in ("utf-8", "windows-1252"): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1797 u = self._convertFrom(proposed_encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1798 if u: break |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1799 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1800 self.unicode = u |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1801 if not u: self.originalEncoding = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1802 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1803 def _subMSChar(self, orig): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1804 """Changes a MS smart quote character to an XML or HTML |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1805 entity.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1806 sub = self.MS_CHARS.get(orig) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1807 if isinstance(sub, tuple): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1808 if self.smartQuotesTo == 'xml': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1809 sub = '&#x%s;' % sub[1] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1810 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1811 sub = '&%s;' % sub[0] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1812 return sub |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1813 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1814 def _convertFrom(self, proposed): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1815 proposed = self.find_codec(proposed) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1816 if not proposed or proposed in self.triedEncodings: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1817 return None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1818 self.triedEncodings.append(proposed) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1819 markup = self.markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1820 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1821 # Convert smart quotes to HTML if coming from an encoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1822 # that might have them. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1823 if self.smartQuotesTo and proposed.lower() in("windows-1252", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1824 "iso-8859-1", |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1825 "iso-8859-2"): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1826 markup = re.compile("([\x80-\x9f])").sub \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1827 (lambda(x): self._subMSChar(x.group(1)), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1828 markup) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1829 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1830 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1831 # print "Trying to convert document to %s" % proposed |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1832 u = self._toUnicode(markup, proposed) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1833 self.markup = u |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1834 self.originalEncoding = proposed |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1835 except Exception, e: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1836 # print "That didn't work!" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1837 # print e |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1838 return None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1839 #print "Correct encoding: %s" % proposed |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1840 return self.markup |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1841 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1842 def _toUnicode(self, data, encoding): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1843 '''Given a string and its encoding, decodes the string into Unicode. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1844 %encoding is a string recognized by encodings.aliases''' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1845 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1846 # strip Byte Order Mark (if present) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1847 if (len(data) >= 4) and (data[:2] == '\xfe\xff') \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1848 and (data[2:4] != '\x00\x00'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1849 encoding = 'utf-16be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1850 data = data[2:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1851 elif (len(data) >= 4) and (data[:2] == '\xff\xfe') \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1852 and (data[2:4] != '\x00\x00'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1853 encoding = 'utf-16le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1854 data = data[2:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1855 elif data[:3] == '\xef\xbb\xbf': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1856 encoding = 'utf-8' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1857 data = data[3:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1858 elif data[:4] == '\x00\x00\xfe\xff': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1859 encoding = 'utf-32be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1860 data = data[4:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1861 elif data[:4] == '\xff\xfe\x00\x00': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1862 encoding = 'utf-32le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1863 data = data[4:] |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1864 newdata = unicode(data, encoding) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1865 return newdata |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1866 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1867 def _detectEncoding(self, xml_data, isHTML=False): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1868 """Given a document, tries to detect its XML encoding.""" |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1869 xml_encoding = sniffed_xml_encoding = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1870 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1871 if xml_data[:4] == '\x4c\x6f\xa7\x94': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1872 # EBCDIC |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1873 xml_data = self._ebcdic_to_ascii(xml_data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1874 elif xml_data[:4] == '\x00\x3c\x00\x3f': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1875 # UTF-16BE |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1876 sniffed_xml_encoding = 'utf-16be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1877 xml_data = unicode(xml_data, 'utf-16be').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1878 elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1879 and (xml_data[2:4] != '\x00\x00'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1880 # UTF-16BE with BOM |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1881 sniffed_xml_encoding = 'utf-16be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1882 xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1883 elif xml_data[:4] == '\x3c\x00\x3f\x00': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1884 # UTF-16LE |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1885 sniffed_xml_encoding = 'utf-16le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1886 xml_data = unicode(xml_data, 'utf-16le').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1887 elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1888 (xml_data[2:4] != '\x00\x00'): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1889 # UTF-16LE with BOM |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1890 sniffed_xml_encoding = 'utf-16le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1891 xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1892 elif xml_data[:4] == '\x00\x00\x00\x3c': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1893 # UTF-32BE |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1894 sniffed_xml_encoding = 'utf-32be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1895 xml_data = unicode(xml_data, 'utf-32be').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1896 elif xml_data[:4] == '\x3c\x00\x00\x00': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1897 # UTF-32LE |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1898 sniffed_xml_encoding = 'utf-32le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1899 xml_data = unicode(xml_data, 'utf-32le').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1900 elif xml_data[:4] == '\x00\x00\xfe\xff': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1901 # UTF-32BE with BOM |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1902 sniffed_xml_encoding = 'utf-32be' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1903 xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1904 elif xml_data[:4] == '\xff\xfe\x00\x00': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1905 # UTF-32LE with BOM |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1906 sniffed_xml_encoding = 'utf-32le' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1907 xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1908 elif xml_data[:3] == '\xef\xbb\xbf': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1909 # UTF-8 with BOM |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1910 sniffed_xml_encoding = 'utf-8' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1911 xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8') |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1912 else: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1913 sniffed_xml_encoding = 'ascii' |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1914 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1915 except: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1916 xml_encoding_match = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1917 xml_encoding_match = re.compile( |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1918 '^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1919 if not xml_encoding_match and isHTML: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1920 regexp = re.compile('<\s*meta[^>]+charset=([^>]*?)[;\'">]', re.I) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1921 xml_encoding_match = regexp.search(xml_data) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1922 if xml_encoding_match is not None: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1923 xml_encoding = xml_encoding_match.groups()[0].lower() |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1924 if isHTML: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1925 self.declaredHTMLEncoding = xml_encoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1926 if sniffed_xml_encoding and \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1927 (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1928 'iso-10646-ucs-4', 'ucs-4', 'csucs4', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1929 'utf-16', 'utf-32', 'utf_16', 'utf_32', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1930 'utf16', 'u16')): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1931 xml_encoding = sniffed_xml_encoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1932 return xml_data, xml_encoding, sniffed_xml_encoding |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1933 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1934 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1935 def find_codec(self, charset): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1936 return self._codec(self.CHARSET_ALIASES.get(charset, charset)) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1937 or (charset and self._codec(charset.replace("-", ""))) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1938 or (charset and self._codec(charset.replace("-", "_"))) \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1939 or charset |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1940 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1941 def _codec(self, charset): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1942 if not charset: return charset |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1943 codec = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1944 try: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1945 codecs.lookup(charset) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1946 codec = charset |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1947 except (LookupError, ValueError): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1948 pass |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1949 return codec |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1950 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1951 EBCDIC_TO_ASCII_MAP = None |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1952 def _ebcdic_to_ascii(self, s): |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1953 c = self.__class__ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1954 if not c.EBCDIC_TO_ASCII_MAP: |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1955 emap = (0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1956 16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1957 128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1958 144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1959 32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1960 38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1961 45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1962 186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1963 195,97,98,99,100,101,102,103,104,105,196,197,198,199,200, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1964 201,202,106,107,108,109,110,111,112,113,114,203,204,205, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1965 206,207,208,209,126,115,116,117,118,119,120,121,122,210, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1966 211,212,213,214,215,216,217,218,219,220,221,222,223,224, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1967 225,226,227,228,229,230,231,123,65,66,67,68,69,70,71,72, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1968 73,232,233,234,235,236,237,125,74,75,76,77,78,79,80,81, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1969 82,238,239,240,241,242,243,92,159,83,84,85,86,87,88,89, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1970 90,244,245,246,247,248,249,48,49,50,51,52,53,54,55,56,57, |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1971 250,251,252,253,254,255) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1972 import string |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1973 c.EBCDIC_TO_ASCII_MAP = string.maketrans( \ |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1974 ''.join(map(chr, range(256))), ''.join(map(chr, emap))) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1975 return s.translate(c.EBCDIC_TO_ASCII_MAP) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1976 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1977 MS_CHARS = { '\x80' : ('euro', '20AC'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1978 '\x81' : ' ', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1979 '\x82' : ('sbquo', '201A'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1980 '\x83' : ('fnof', '192'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1981 '\x84' : ('bdquo', '201E'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1982 '\x85' : ('hellip', '2026'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1983 '\x86' : ('dagger', '2020'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1984 '\x87' : ('Dagger', '2021'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1985 '\x88' : ('circ', '2C6'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1986 '\x89' : ('permil', '2030'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1987 '\x8A' : ('Scaron', '160'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1988 '\x8B' : ('lsaquo', '2039'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1989 '\x8C' : ('OElig', '152'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1990 '\x8D' : '?', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1991 '\x8E' : ('#x17D', '17D'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1992 '\x8F' : '?', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1993 '\x90' : '?', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1994 '\x91' : ('lsquo', '2018'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1995 '\x92' : ('rsquo', '2019'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1996 '\x93' : ('ldquo', '201C'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1997 '\x94' : ('rdquo', '201D'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1998 '\x95' : ('bull', '2022'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
1999 '\x96' : ('ndash', '2013'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2000 '\x97' : ('mdash', '2014'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2001 '\x98' : ('tilde', '2DC'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2002 '\x99' : ('trade', '2122'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2003 '\x9a' : ('scaron', '161'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2004 '\x9b' : ('rsaquo', '203A'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2005 '\x9c' : ('oelig', '153'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2006 '\x9d' : '?', |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2007 '\x9e' : ('#x17E', '17E'), |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2008 '\x9f' : ('Yuml', ''),} |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2009 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2010 ####################################################################### |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2011 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2012 |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2013 #By default, act as an HTML pretty-printer. |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2014 if __name__ == '__main__': |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2015 import sys |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2016 soup = BeautifulSoup(sys.stdin) |
03c22b722882
remove BeautifulSoup dependency
Richard Burhans <burhans@bx.psu.edu>
parents:
diff
changeset
|
2017 print soup.prettify() |