如何清除html中 反复嵌套的标签

在帮人爬一个奇葩网站的数据中,发现一些网页的表格 无论是用BeautifulSoup 还是 lxml解析都是失败 或者不完整的。
查看页面源码发现,表格最后一列的所有数据 虽然都只有一个 '-',但是内容却是藏在非常大量的无用标签底下。
其他列的数据 只是在table/tbody/tr/td/div/span 下
仅这列的数据 是在table/tbody/tr/td/div/span/+(非常多层的div span)下。

删除了部分多于的内容后,html文件百度网盘链接在此,
问题html文件

总的来说,我的问题就是,如何判别这种无限叠加的无效标签,并替换为能被BS或者lxml读取的格式?

现在正在试验的是 lxml中Cleaner类
page = open(test_path, encoding='utf-8').read()
cleaner = Cleaner(style=True, remove_tags=['div','span', 'font'])
page = cleaner.clean_html(page)

如果读入内容仅一层 tr的话倒是能正确清理了!
但是如果把整个表的html读入,进行清理,不知道因为什么原因。
只能读入到嵌套的地方未知,后续的内容全部被删。
初步怀疑是python的递归限制?

正在试验xpath。
试验失败。
通过xpath读取tabl下的tr标签 查看数量。
发现也仅能读取嵌套位置前的tr标签,后续标签无法查询。

阅读 5.6k
4 个回答

问题解决了。
虽然之前试验的方法 全部无效。
最终还是用BeautifulSoup来处理。
只是修改了python限制的递归层数。

sys.setrecursionlimit(5000) 用来处理这种愚蠢的无限嵌套。

没有很仔细的看,但是我发现你需要的数据应该都在div下面的span标签,而且span标签都有style属性。另外最后一列都在p标签下,其实还是有规律的

span下直接\text()应该可以吧(xpath是这样的)

新手上路,请多包涵

只会用xpath 可以用 //div/span/div
只要跟别的行有一点不同就行 //会自动找匹配而不考虑位置

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题