BeautifulSoup成功编写html,但是find_all不返回任何内容

时间:2018-12-04 13:45:17

标签: python html beautifulsoup ipython jupyter

我正在使用BeautifulSoup创建和写入html文件。我可以为MWE创建一个简单的html,如下所示。但是,所有查找功能均不返回任何内容,因此无法执行进一步的操作(插入,追加)。

  1. 发生了什么事?
  2. 如何单独为一个div设置样式? (例如,div2和div3应具有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笔记本html文件。在此更新之后,我需要向与每个html(每个笔记本)文件相对应的单个div中添加样式。

Here是nbviewer头

1 个答案:

答案 0 :(得分:1)

BeautifulSoup似乎没有正确地将新的可导航字符串添加为可导航字符串,而是添加为字符串。这样一来,他们的find函数就不能使用它了,但是,如果您使用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上定义样式。