BeautifulSoup成功写入html但find_all没有返回任何内容

问题描述 投票:1回答:1

我正在使用BeautifulSoup来创建和编写html文件。我能够为MWE创建一个简单的html,如下所示。但是,所有find函数都不返回任何内容,因此无法执行进一步的操作(insert,append)。

  1. 怎么了?
  2. 如何单独为其中一个div设置样式? (例如,div 2和div 3应该有display:none,后来我计划通过脚本启用)

MWE:

head_soup = BeautifulSoup(open(nbheader_template),"html.parser")
head_soup.contents[0]

base_template = "<!DOCTYPE html><html></html>"
main_soup = BeautifulSoup(base_template,"html.parser")

main_soup.html.append(head_soup)  # add nbconver header

# INSERT THE BODY AS IT IS
# bodies = [body.replace('<body>','').replace('</body>','') for body in bodies]  # no need of body tags
bodies = ['<div>Test div' + str(i+1) + '</div>' for i in range(3)] # for MWE
body_tag = main_soup.new_tag('body')
for each_body in bodies:
    body_tag.append(BeautifulSoup(each_body,'html.parser'))
main_soup.html.insert(1,body_tag)    


with open(output_filename, "w") as file:
    file.write(str(main_soup))

print(main_soup.find_all('head'))
print(main_soup.html.find_all('head'))
print(main_soup.find_all('body'))
print(main_soup.html.find_all('body'))
print(main_soup.find_all('div'))
print(main_soup.html.find_all('div'))

输出: enter image description here

文件输出: enter image description here

上下文:我正在尝试组合多个jupyter notebook html文件。在此更新之后,我需要将样式添加到与每个html(每个笔记本)文件对应的各个div。

Here是nbviewer的负责人

python html beautifulsoup ipython jupyter
1个回答
1
投票

看起来好像BeautifulSoup没有正确地将新的可导航字符串添加为可导航的字符串,而是作为字符串添加。这使得它们的查找功能不起作用,但是如果你把main_soup.prettify()并将它反馈回美丽的汤,你就能按预期导航输出。

main_soup
<!DOCTYPE html>
<html><body><div>Test div1</div><div>Test div2</div> 
<div>Test div3</div></body></html>
>>> new_soup = BeautifulSoup(main_soup.prettify())
>>> new_soup.body
<body>
<div>
 Test div1
</div><div>
 Test div2
</div><div>
 Test div3
</div>
</body>
>>> new_soup.html.find_all('div')
[<div>
 Test div1
</div>, <div>
 Test div2
</div>, <div>
 Test div3
</div>]

要将样式设置为其中一个div,您可以导航到它,然后为要添加的样式添加类。除非你只想在一个地方使用这种风格,否则每个div都有不同的风格。我建议使用带有类的css来定义你想要的div上的样式。

© www.soinside.com 2019 - 2024. All rights reserved.