python - 如何清除html中 反复嵌套的标签
巴扎黑
巴扎黑 2017-04-18 09:44:21
[Python讨论组]

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

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

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

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

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

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

巴扎黑
巴扎黑

全部回复(4)
天蓬老师

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

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

大家讲道理

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

大家讲道理

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

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号