Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit226b37c

Browse files
committed
Fixed various BeautifulSoup bugs, including issue 70
--HG--extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%401161
1 parentabf1605 commit226b37c

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

‎src/html5lib/treebuilders/soup.py

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,35 @@ class Element(_base.Node):
2525
def__init__(self,element,soup):
2626
_base.Node.__init__(self,element.name)
2727
self.element=element
28-
self.soup=soup
28+
self.soup=soup
29+
30+
def_nodeIndex(self,node,refNode):
31+
# Finds a node by identity rather than equality
32+
forindexinrange(len(self.element.contents)):
33+
ifid(self.element.contents[index])==id(refNode.element):
34+
returnindex
35+
returnNone
2936

3037
defappendChild(self,node):
3138
if (node.element.__class__==NavigableStringandself.element.contents
3239
andself.element.contents[-1].__class__==NavigableString):
33-
newNode=TextNode(NavigableString(
34-
self.element.contents[-1]+node.element),self.soup)
35-
self.element.contents[-1].extract()
36-
self.appendChild(newNode)
40+
# Concatenate new text onto old text node
41+
# (TODO: This has O(n^2) performance, for input like "a</a>a</a>a</a>...")
42+
newStr=NavigableString(self.element.contents[-1]+node.element)
43+
44+
# Remove the old text node
45+
# (Can't simply use .extract() by itself, because it fails if
46+
# an equal text node exists within the parent node)
47+
oldElement=self.element.contents[-1]
48+
delself.element.contents[-1]
49+
oldElement.parent=None
50+
oldElement.extract()
51+
52+
self.element.insert(len(self.element.contents),newStr)
3753
else:
3854
self.element.insert(len(self.element.contents),node.element)
3955
node.parent=self
40-
56+
4157
defgetAttributes(self):
4258
returnAttrList(self.element)
4359

@@ -56,18 +72,25 @@ def insertText(self, data, insertBefore=None):
5672
self.appendChild(text)
5773

5874
definsertBefore(self,node,refNode):
59-
index=self.element.contents.index(refNode.element)
75+
index=self._nodeIndex(node,refNode)
6076
if (node.element.__class__==NavigableStringandself.element.contents
6177
andself.element.contents[index-1].__class__==NavigableString):
62-
newNode=TextNode(NavigableString(
63-
self.element.contents[index-1]+node.element),self.soup)
64-
self.element.contents[index-1].extract()
65-
self.insertBefore(newNode,refNode)
78+
# (See comments in appendChild)
79+
newStr=NavigableString(self.element.contents[index-1]+node.element)
80+
oldNode=self.element.contents[index-1]
81+
delself.element.contents[index-1]
82+
oldNode.parent=None
83+
oldNode.extract()
84+
85+
self.element.insert(index-1,newStr)
6686
else:
6787
self.element.insert(index,node.element)
6888
node.parent=self
6989

7090
defremoveChild(self,node):
91+
index=self._nodeIndex(node.parent,node)
92+
delnode.parent.element.contents[index]
93+
node.element.parent=None
7194
node.element.extract()
7295
node.parent=None
7396

@@ -93,7 +116,7 @@ class TextNode(Element):
93116
def__init__(self,element,soup):
94117
_base.Node.__init__(self,None)
95118
self.element=element
96-
self.soup=soup
119+
self.soup=soup
97120

98121
defcloneNode(self):
99122
raiseNotImplementedError

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp