V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
51300520
V2EX  ›  问与答

爬虫选 xpath 还是 css selector?

  •  
  •   51300520 · 2019-04-14 01:35:59 +08:00 · 4387 次点击
    这是一个创建于 2081 天前的主题,其中的信息可能已经有所发展或是发生改变。

    解析 html 元素用哪个更好?我不要什么性能,爬虫最重要的是稳定,如果考虑网页改变这种可能性,哪个选择器的适应性更强? 我意思是网页如果改变了,但是不是那种大改,哪个更容易在不改爬虫代码的情况下更可能适应?

    21 条回复    2019-04-15 10:06:25 +08:00
    herozzm
        1
    herozzm  
       2019-04-14 01:37:28 +08:00 via iPhone
    都要
    jquery
    正则
    json

    必须好的
    51300520
        2
    51300520  
    OP
       2019-04-14 01:38:35 +08:00
    我只想知道几率大小而已,虽然没有哪种可以百分之百不改代码,因为我以前一直是用 css 没用过 xpath,想找大家了解下,如果 xpath 适应性更强我就换成 xpath 的
    51300520
        3
    51300520  
    OP
       2019-04-14 01:39:54 +08:00
    @herozzm
    很多时候只要一样就可以,我以前没用 xpath,一直用 css,基本没有定位不到的,既然如此我要选一个更健壮的
    herozzm
        4
    herozzm  
       2019-04-14 01:42:08 +08:00 via iPhone
    @51300520 需要多样性 不然适配部分网站
    binux
        5
    binux  
       2019-04-14 01:43:14 +08:00 via Android   ❤️ 1
    是否健壮和用什么工具无关
    51300520
        6
    51300520  
    OP
       2019-04-14 01:48:38 +08:00
    @binux
    是吗?假如我现在页面里面有一个 class 叫 test, 那我用 css 选就是 css(.test),但是它的路径是页面第三个元素,那我用 xpath 就可以用路径来选 html[3], 这两种情况健壮性怎么可能不一样呢,假如人家网页维护,test 类变成 demo 类,css 就选不到了,假如他路径没变,xpath 依然可以选到
    herozzm
        7
    herozzm  
       2019-04-14 01:52:12 +08:00 via iPhone
    jquery 方式可以
    binux
        8
    binux  
       2019-04-14 02:04:13 +08:00 via Android
    @51300520 那你不会在 CSS selector 中用 nth-child 吗?
    loginbygoogle
        9
    loginbygoogle  
       2019-04-14 02:07:54 +08:00 via Android
    无论什么 html 爬虫框架,如果网站本身的结构变了,都得改,没有一劳永逸的。
    51300520
        10
    51300520  
    OP
       2019-04-14 02:13:33 +08:00
    刚看了下 xpath,发现这个问题提得多余了,这玩意和 css 功能绝大部分是重叠的,一个不行的话那另一个也不行
    crab
        11
    crab  
       2019-04-14 04:05:50 +08:00
    直接正则也是可以。
    Leigg
        12
    Leigg  
       2019-04-14 08:11:04 +08:00 via iPhone
    当然是都用。
    Leigg
        13
    Leigg  
       2019-04-14 08:11:21 +08:00 via iPhone
    也并不复杂,一两天就学会了。
    Leigg
        14
    Leigg  
       2019-04-14 08:12:11 +08:00 via iPhone
    大部分情况下用 css 的表达式很简单。
    wedoub
        15
    wedoub  
       2019-04-14 08:43:56 +08:00 via iPhone
    正则表达式更好用我觉得
    iyaozhen
        16
    iyaozhen  
       2019-04-14 08:47:46 +08:00 via Android
    页面变了,用啥都得改

    我一般自动化测试用 css selector,方便和前端沟通
    charlie21
        17
    charlie21  
       2019-04-14 09:01:52 +08:00
    用 CSS 选择器,当遇到 CSS 做不到的东西 的时候 再考虑 XPath
    dsg001
        18
    dsg001  
       2019-04-14 09:40:16 +08:00
    混用,哪个方便用哪个
    baitei
        19
    baitei  
       2019-04-14 15:20:57 +08:00
    我是首先 css selector,简单。
    页面变了大概率得改程序,做不到想一劳永逸。
    程序代码适应性很差的,以后要是爬虫用上了深度学习,会智能很多哈。
    hakono
        20
    hakono  
       2019-04-14 16:50:40 +08:00 via Android
    正则就算了吧。。。。写出来过段时间都不知道写的表达式是什么玩意。。。加注释也没用

    老老实实 css 选择器就行,稳定性这个无解。因为你不知道对方网站前端下次会把网页结构改成什么样子

    解决办法其实挺简单的,把 css 选择器的字符串从代码中剥离,塞入单独的文件里,txt 啊,json 啊,数据库啊都行,从这些地方读取提取规则再匹配

    实现起来是比直接写死在代码里复杂了那么点,但之后维护起来那就很爽了
    bduqw
        21
    bduqw  
       2019-04-15 10:06:25 +08:00 via Android
    基本就是 CSS,不行就正则
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.