如何解决 html 代码中“<a><b></a></b>”这样的错误

2016-10-23 19:28:56 +08:00
 omg21
浏览器对 html 代码的容错性很强,像下面这句,两个标签开始结束的位置差开了,应该是个包含结构, a 包含 b ,结果错成了交叉结构。
但是这样浏览器也能正常解析。

<a target="_blank" href="http://wenda.eask.org/"><b>我要提问</a></b>

可是 BS4 在处理这样的页面时就中枪了,其实还有其他一些错误,比如,一个页面有好几个“<body>”标签,这个处理时比较简单,只保留第一个“<body>”,把后边的全删除即可。但这种交叉的我现在还想不出如何来处理。

附上句中的地址 http://www.eask.org/beijing/
2544 次点击
所在节点    Python
12 条回复
menc
2016-10-23 20:30:32 +08:00
使用容错性高的 html parser ,但是这个问题我记得 bs4 是可以解决的
MinonHeart
2016-10-23 20:56:12 +08:00
把标签写正确🙃
binux
2016-10-23 21:00:52 +08:00
lxml.html, html5parser
omg21
2016-10-23 21:06:35 +08:00
@menc 我用的就是 html parser
menc
2016-10-23 22:02:52 +08:00
@omg21 。。。。 html parser 是 general 的概念,不是某一个库或者东西。你应该尝试其他的 html parser


@binux lxml 是不行的, lxml 对 html 符合标准要求很严格
mhycy
2016-10-23 22:07:09 +08:00
碰上这种页面直接上正则表达式解决
binux
2016-10-23 22:23:29 +08:00
@menc
In [1]: import lxml.html

In [2]: dom = lxml.html.fromstring(u'<a target="_blank" href="http://wenda.eask.org/"><b>我要提问</a></b>')

In [3]: print lxml.html.tostring(dom, encoding="unicode")
<a target="_blank" href="http://wenda.eask.org/"><b>我要提问</b></a>
omg21
2016-10-23 23:22:51 +08:00
@binux pypi 现在上不去了,暂时没法试。如果是全文而不是这一句,能改过来吗?
omg21
2016-10-23 23:24:26 +08:00
@mhycy 不行啊,我做的是通用处理,像这种类型的没法判断错误原因,更没法用正则处理。
menc
2016-10-23 23:43:46 +08:00
@binux 那就行:)
firemiles
2016-10-24 00:09:25 +08:00
只识别标签头,任意结束标签当当前起始标签的结束,这么干就随意交叉,只要头的顺序对就行
jaimezhan
2016-10-24 11:02:08 +08:00
写代码不严谨 或者使用编辑器的插件 自动补充关闭标签减少类似的错误代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/314827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX