有时在向文档添加新元素后,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)