BeautifulSoup append()导致随后的find()失败



有时在向文档添加新元素后,find()会失败。具体来说,如果对被追加的元素进行追加操作。如果在第一个元素添加到文档之前将第二个元素添加到第一个元素,则会发生错误。下面是一个失败的例子:

from bs4 import BeautifulSoup, NavigableString
import traceback
template = """
<html>
<body>
<table>
</table>
<p class="overview">
Test
</p>
</body>
</html>
"""
doc = BeautifulSoup(template, 'html.parser')
for row_count in range(2):
row = doc.new_tag('tr', id=f'row_{row_count}')
doc.find('table').append(row)

print(doc.find(id='row_0'), 'n')
cell = doc.new_tag('td',class_='item')
x = NavigableString('hi')
cell.contents.append(x)
doc.find(id='row_0').append(cell)
print(doc.find(id='row_1'), 'n')
print(doc.prettify())

我的输出是:

<tr id="row_0"></tr> 
None 
<html>
<body>
<table>
<tr id="row_0">
<td class_="item">
hi
</td>
</tr>
<tr id="row_1">
</tr>
</table>
<p class="overview">
Test
</p>
</body>
</html>

似乎解决方案是确保只对已经添加到文档中的元素进行追加。

我正在使用bs4版本'4.8.2'

解决方案似乎是确保只对已经添加到文档中的元素进行追加。例子:

import traceback
template = """
<html>
<body>
<table>
</table>
<p class="overview">
Test
</p>
</body>
</html>
"""
doc = BeautifulSoup(template, 'html.parser')
for row_count in range(2):
row = doc.new_tag('tr', id=f'row_{row_count}')
doc.find('table').append(row)

print(doc.find(id='row_0'), 'n')
cell = doc.new_tag('td',class_='item')
x = NavigableString('hi')
doc.find(id='row_0').append(cell)
cell.contents.append(x)
print(doc.find(id='row_1'), 'n')
print(doc.prettify())

输出:

<tr id="row_0"></tr> 
<tr id="row_1"></tr> 
<html>
<body>
<table>
<tr id="row_0">
<td class_="item">
hi
</td>
</tr>
<tr id="row_1">
</tr>
</table>
<p class="overview">
Test
</p>
</body>
</html>

解决方法是调用元素的append()函数,而不是元素的内容。

cell.append(x)

相关内容

  • 没有找到相关文章

最新更新