各位大佬有什么好的办法解析网页中不规整的表格吗

2020-02-20 15:43:12 +08:00
 MrhuangSTR

像几乘几这种规整的表格到很好解析,xpath 或者 bs4 或者 pandas 的 read_html 可以搞定,但是遇到那种不规整的表格,而且整个网站的表格样式可能都不一样,有什么好的办法做到通用解析,例如这个网站的表格

3952 次点击
所在节点    Python
36 条回复
wangyzj
2020-02-20 21:55:30 +08:00
不得不说国土资源部的网站做的还是挺清秀的
akira
2020-02-20 22:27:48 +08:00
不要管 trtd, 全部内容提取出来,然后再统一清洗
encro
2020-02-20 22:51:53 +08:00
直接使用 xpath 或者 css 遍历,最简单网站了。
encro
2020-02-20 23:01:33 +08:00
原来是表格啊。
不太可能有通用的,因为表格就不规范。
你只能根据不同类型自己去写解析程序了。

提示下:
table 的 tr 下是 td,td 有两个属性,rowspan 和 colspan,它们的值就是分析表格的关键。但是对于这种不规则的,只能自己写程序,看有多少种类型,就微调下吧。
TimePPT
2020-02-20 23:40:49 +08:00
换个思路,全部抓图然后表格 ocr 接口识别
locoz
2020-02-20 23:42:23 +08:00
无解。先拿下来再处理吧,按特征分成一类一类地处理,慢慢的就处理完了。
然后建议用 GUI 标记工具(指类似于 pyspider、各种傻瓜式爬虫工具的点页面元素自动输出 xpath 到对应采集字段上的)辅助,要不然手写 xpath 很蛋疼。
MrhuangSTR
2020-02-21 10:18:14 +08:00
@freakxx 标题有的带冒号有的不带。。
另外你举的这个面积的例子,烦就烦在可能在其他表格里它对应的值就和它在一个 tr 里而不是下一个 tr;
后面你说的这个方法应该是在已经确定需要哪些字段的情况下再去 mapping
MrhuangSTR
2020-02-21 10:18:45 +08:00
@akira 清洗规则很难定
MrhuangSTR
2020-02-21 10:26:27 +08:00
@locoz 这里的 xpath 倒不是很杂,看来只能分多种情况了
hitaoguo
2020-02-21 10:46:20 +08:00
建议楼主贴几个不同类型的表格网址出来。
freakxx
2020-02-21 11:04:06 +08:00
@MrhuangSTR

你多抓几份看看就可以了,
位置相对是固定的。

你事先做一份已经确定不就好?如果没 map 到,再手动补上去,这个工作总能完成的。
MrhuangSTR
2020-02-21 18:44:03 +08:00
@freakxx 这是个体力活啊,终于是搞定了。。
Skyline57
2020-05-19 18:36:36 +08:00
@MrhuangSTR 同病相怜啊楼主,我最近也是在搞这些 ZF 的数据,不过我好像解决了,找到了一种通用的方式
我用的 xpath ( xpath 还是挺好使的),把键和值分开来获取,最后再 zip 到一起
原理是:td 位置为奇数则是键,为偶数则是值
(键为土地编号、面积等,值为据图数值)
获取键的表达式:"//table//table//td[position() mod 2 = 1]"
获取值的表达式:"//table//table//td[position() mod 2 = 0]"

但是,提取之后会发现有的键是没有对应值的(比如“主要用途”那栏的值是空的)
这时就要把没有对应值的键单独提出来
观察几个网站发现没有对应值的键的相似之处为:都有 colspan="3"或者 colspan="6"的属性

所以
提取的 xpath 表达式为:'//table//table//td[position() mod 2 = 1][@colspan="3" or @colspan="6"]'

最后把没有对应值的键都从所有键中剔除或者设为空,其他键值对一一对应即可

.......
.......

最后发现出了点小问题

呃呃呃,:面积"那栏键值是竖着的,不是向其他的那样横着的,也就是上述的最终键值对被污染了
但是对"面积"这对键值单独处理下,应该问题不大,思路是用 xpath 获取到 text()为"面积"的 td 节点,再通过这个节点的父级 tr 的下一位置 tr 下的 td 获取到面积的数值,再从键列表中删除"面积",值列表中删除面积的值

最后终于大功告成
MrhuangSTR
2020-05-25 16:01:20 +08:00
@Skyline57 我跟你的解析思路一样的,花了我一天的时间,这玩意太折磨人了
Skyline57
2020-05-25 17:19:43 +08:00
@MrhuangSTR 我还遇到过一个网页里两三种编码的,真是吐了
MrhuangSTR
2020-05-26 10:32:59 +08:00
@Skyline57 编码还好吧,一个网页有几种非常规的字体的你遇到过吗 ̄へ ̄

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

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

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

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

© 2021 V2EX