其他类似题目的问题都没有回答我的问题.

如果我执行以下命令:

from  bs4 import BeautifulSoup
soup = BeautifulSoup("<html><body><p>111</p><p>before<ul><li>222</li></ul>after</p></body></html>", "lxml")
soup.find_all(["p", "li"])

我得到的结果是:

[<p>111</p>, <p>before</p>, <li>222</li>]

我希望在结果中也能找到"After",或者作为第二个"p"元素的一部分,或者作为列表中的第四个项目.

Is this expected behaviour? Is there a way to retrieve the text "after"?

更奇怪的是,如果我做print(soup.prettify()),这就是结果.

<html>
 <body>
  <p>
   111
  </p>
  <p>
   before
  </p>
  <ul>
   <li>
    222
   </li>
  </ul>
  after
 </body>
</html>

"ul"和"After"不再是第二个"p"的一部分.我假设源文件不是有效的html(?),但再次声明:

Is there a way to deal with this, except from just dropping "after"?

推荐答案

在本例中,我建议使用与lxml不同的解析器:html.parser.lxmlhtml.parser更严格:

soup = BeautifulSoup("<html><body><p>111</p><p>before<ul><li>222</li></ul>after</p></body></html>", "html.parser")
print(soup.find_all(["p", "li"]))

打印:

[<p>111</p>, <p>before<ul><li>222</li></ul>after</p>, <li>222</li>]

Html相关问答推荐

为什么html复选框总是具有只读属性?

NG8004:找不到名为""的管道.'' [插件Angular 编译器]

在CSS中不保持圆形图像形状的边框半径属性

在浮动元素旁边垂直居中

滚动两个不同高度的DIV;一个等待另一个

IFRAME中的Chrome图像未调整大小

Django HTML标记-Merge for Loop with Conditional语句

浮动Div在CSS中未按预期工作

为什么 Select 元素在带有数据绑定的Blazor上行为怪异?

我如何确保我的网格永远不会小于它的子网格

使用不同字体对齐元素

来自元标记的响应文本

pull-right 不适用于 bootstrap alert 内的按钮

带有伪元素的不规则形状的渐变边框

Cargo 在网格中的排列

如何使用 CSS 使粘性元素固定在视口顶部

如何从 razor 页面打开 html 页面

我如何让这个动画播放,然后停止,然后在设定的时间后再次播放? (CSS)

如何使列表的第一个元素比 css 中的其他元素大?

如何将内容从侧边栏的底部移动到右侧?