为什么爬虫大佬多用 re 而少用 soup、xml 来提取元素?

2020-05-11 19:44:29 +08:00
 crella
我也知道:先问是不是,再问为什么。

最近找了几个 python 爬虫来看,它们都是单文件解决从抓取到存储、生成结果的整个流程的。我发现一些大佬经常用 re 等正则表达式匹配元素,而我如果要提取那些元素,只想慢慢地用 xml 或者 json 相关的解析库。

我个人感觉正则表达式的匹配命令相对较长,而且感觉不好调试的样子。有时候网页上部分标签内的内容为空,不知道正则表达式是怎么处理这些异常的。

而使用 xml 或 json 配套库的缺点是如果由于网站服务器设置问题或者网络不好,导致下载的页面文本不完整,丢了部分标签,整个 xml 或 json 就解析不了了。而正则表达式则能避免这种问题。

不知道各位怎么看?
7238 次点击
所在节点    Python
45 条回复
renmu
2020-05-12 08:49:52 +08:00
正则没有依赖,但是维护的时候完全不知道当时怎么写的了
zengxs
2020-05-12 09:20:02 +08:00
css selector + xpath + regex 都写,使用顺序也是按这个,优先使用 css selector,这个解决不了才考虑下一种方案
aaronhua
2020-05-12 09:21:57 +08:00
同上 lxml 加 re
fancy111
2020-05-12 09:23:26 +08:00
xpath 都这么多年了竟然还在说。
爬基本的东西随便你用哪个方式都差不多,有反爬的这些都没用。
warcraft1236
2020-05-12 09:33:29 +08:00
做过 UI 自动化的基本上不推荐用 xpath 吧,这玩意速度慢
xpresslink
2020-05-12 09:34:19 +08:00
说句心里话,这个并没有什么一定之规,每个方法都有其局限性,要权衡利弊选择。所以都要能熟练使用。
dbow
2020-05-12 09:40:37 +08:00
xpath 性能比较差,不推荐大规模抓取使用, 正则其实写好了才会比较快。
aaa5838769
2020-05-12 09:41:36 +08:00
Xpath+1 但是感觉用正则比较好一些,
xuminzhong
2020-05-12 09:46:12 +08:00
@zengxs 正解。
我也是这样,不过我的框架要强大很多,script 、JSON 、AJAX 都支持,而且可以用链式一行搞定。
如果只是简单的新闻或 blog 类型页面,可以自动提取,不需要写规则。
shawndev
2020-05-12 10:04:12 +08:00
因为对于主要精力不是爬虫的工程师,日常用到 regex 的机会更多,故而更熟悉。
XIVN1987
2020-05-12 10:08:22 +08:00
@shawndev
对,,在编辑器里搜索文本内容时经常使用正则,,
paoqi2048
2020-05-12 10:08:40 +08:00
xpath 也不错
keepeye
2020-05-12 10:10:09 +08:00
正则挺好的啊 用习惯了
locoz
2020-05-12 10:40:56 +08:00
不存在“多用 re 而少用 soup 、xml 、json 相关解析库”,都是看情况使用的。
结构简单、字段少、不需要考虑复用和增加字段问题,那就正则呗,简单粗暴一行搞完。
结构复杂、字段多、还需要考虑到后续其他地方复用,并且还有可能会需要增加字段,那你用正则不是写到头秃?而且出个问题还很难解决,后续看还不一定看得懂。

再说了,如果数据本来就是 JSON 、XML 、HTML,并且你提取的东西也都存在于结构体里面,那为什么不采用对应的解析库解析成 dict/list 再操作呢?说实在的,就那点性能损耗,根本不值一提,通常还没生成个加密参数花的时间多。用对应的解析库提升出来的开发效率(比如自动按路径生成解析代码)和可维护性(要在某个字段下增加获取子字段)更有价值。

所以通常来说正则的使用场景更多地是补充那些专门的解析库处理不了的场景,比如:
HTML 里嵌了个当成 JSON 使用的 Javascript Object,并且和其他代码混在同一个标签里,那当然是用正则直接提出来再调用 JS 把它转成 JSON 字符串再处理更方便。要不然你一个一个提取字段,后面维护起来直接爆炸。
Cmdhelp
2020-05-12 10:52:40 +08:00
re 处理不规整网页比较好,效率也高

soup 、xml 只适合处理相当规整的网页
SlipStupig
2020-05-12 11:32:05 +08:00
身边的统计学
CRVV
2020-05-12 12:38:50 +08:00
因为有一些人非常喜欢用正则表达式
'a b c'.split(' ') 要用 (.*)\ (.*)\ (.*)
判断一个长度是 10 的 hex 字符串要用 [0-9a-f]{10}
凡是处理字符串的事情,他们都要上正则表达式。

从 html 或者 json 里提取数据也是处理字符串,他们当然要上正则表达式了。

至于这样做到底合不合适,有一个著名的 stackoverflow
https://stackoverflow.com/questions/1732348
neoblackcap
2020-05-12 13:55:44 +08:00
用正则能解决大多数文字提取的工作,不过你了解编译原理的话。你就知道不是什么语言都是 RE 语言,不能完全用正则表达式正确解析
bulabean
2020-05-12 14:40:12 +08:00
习惯 xpath +re,bs 只是名气大而已
JCZ2MkKb5S8ZX9pq
2020-05-12 16:04:52 +08:00
xpath 之类的需要先把 xml 结构提取一遍,效率是受点影响。但可读性往往比较好。
正则快,但可读相比就差点。
容错其实差不多,结合可读的话,感觉还是 xpath 好点。

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

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

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

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

© 2021 V2EX