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

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

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

4169 次点击
所在节点    Python
36 条回复
MrhuangSTR
2020-02-20 17:52:54 +08:00
大佬在哪里 f(;´д`)ゞ
akira
2020-02-20 17:59:52 +08:00
这个不是表格吧。。。
deplives
2020-02-20 18:05:38 +08:00
这哪里有表格?
qazwsxkevin
2020-02-20 18:06:29 +08:00
依然用 for bs4 吧
每个 div 下面有 ul
每个 ul 下面有 5 个 li
很明显的特征,性能不好的写法是啰嗦写多几个字典,逐个判断,逐个加
不知道有无更好性能方法了
MrhuangSTR
2020-02-20 18:08:48 +08:00
@akira 额 点进去每个公告里的表格
MrhuangSTR
2020-02-20 18:09:26 +08:00
@deplives 每个公告的表格。。
MrhuangSTR
2020-02-20 18:09:36 +08:00
@qazwsxkevin 公告里的表格。。
qazwsxkevin
2020-02-20 18:18:31 +08:00
@MrhuangSTR 我能想到的是找出这个表格的 table 标签,然后对每个 tr 段,再对每个 td 做 get_text()了
然后再洗数据加进字典
就看了几个页面,似乎都差不多格式
deplives
2020-02-20 18:18:41 +08:00
@MrhuangSTR 请善用浏览器调试功能
![]( )
superrichman
2020-02-20 18:24:24 +08:00
这种不规则的表格没有通用的解析方法,自己一个一个遍历元素取数据吧。还有这是个 gov 网站,如果你是想做爬虫的话,小心点别变成了 ddos 攻击 zf 网站。 /doge
MrhuangSTR
2020-02-20 18:26:36 +08:00
@qazwsxkevin 每个栏目下分页基本上都有 120 页,可能前 1 到 20 页里的公告表格样式基本一致,某个区间段的表格格式又是另外一种,我现在大概看了下有 4 种不一样的表格,可能还有更多种。
MrhuangSTR
2020-02-20 18:27:32 +08:00
@deplives 没这么简单的,多点开几个表格看看你会发现惊喜的 /doge
MrhuangSTR
2020-02-20 18:28:48 +08:00
@superrichman 我 ip 今天就被 ban 了。。。。我都是很佛系的抓
autoxbc
2020-02-20 18:44:41 +08:00
都是很标准的表格,看不出有什么问题,最多有跨单元属性 colSpan 和 rowSpan,也是 html 标准之中的
L2AKnG8GXx60bc6P
2020-02-20 19:09:28 +08:00
我做过
MrhuangSTR
2020-02-20 21:08:29 +08:00
@autoxbc 表格没啥问题,棘手的是怎么写一个通用的方法解析整站不同样式的表格
MrhuangSTR
2020-02-20 21:08:47 +08:00
@relic 有什么好的办法分享下呗大佬
freakxx
2020-02-20 21:19:22 +08:00
应该是没有通解办法,

用 table 做的时候,他们都是直接怼进去 td 里面。

有个办法你可以尝试下, 你先做一个判断是不是标题的函数, 然后扔进去解解看。
比如最后带 ":" 判断为 label。

但实话说,我觉得这个很难洗干净,至少不是一下子能洗干净。
freakxx
2020-02-20 21:23:19 +08:00
但这类垂直爬取 有一个好处

你可以自己先拿几个 做个处理就干净很多。
比如你判断 “面积” 为 label 的时候,通过对比,知道一般他是在下一个 tr 里面,你写 parse 的时候,就把 2 个 tr 合起来,
直接默认拿 tr_1.td_1: tr_2.td_1, tr_2: td_2
freakxx
2020-02-20 21:32:37 +08:00
这种要洗干净你可以这么做。

先下下来,随便拿一个,把表格洗了,然后字段扔进去 mapping, 如
{
"面积": parse_rule_1,
}

parse_rule_1(table, td)
td = td. next_tr.td[index]
table.pop(td)

最后如果 table 里面还有元素的话,那么就是有新的元素,直接报错。
你再手动去处理下。

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

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

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

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

© 2021 V2EX