代码之家  ›  专栏  ›  技术社区  ›  Daniel

可以定义一个HTML选择器来连接多个选择器并用分号分隔它们吗?

  •  1
  • Daniel  · 技术社区  · 7 年前

    我试图用 pup . 这是一个命令行HTML解析器,它接受通用的HTML选择器。

    我要选择:

    'div.aclass text{}' #(would be SampleA)
    

    我还想选择:

    'div.bclass text{}' #(would be SampleB)
    

    我想将它们连接起来并插入一些自定义文本以获取:

    SampleA;MYEXTRASTRING;SampleB
    

    我想避免多次打电话给小狗,因为它很慢。

    我可以选择多个标记:

    'div.aclass text{}, div.bclass text{}'
    

    但这将导致:

    SampleA
    SampleB
    

    有比小狗更好的选择吗?

    (注意:Python不是一个选项,因为它对于我的需要来说非常慢。)

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kevin Cui    7 年前

    带有pup的多个选择器似乎不起作用,这里有一个问题: https://github.com/ericchiang/pup/issues/59

    为了达到你的目的,我建议使用 HX选择 命令,可以在里面找到 HTML XML实用程序 : https://www.w3.org/Tools/HTML-XML-utils/README

    例子:

    curl -s http://example.com/ | hxselect -c 'body > div:nth-child(1) > h1:nth-child(1)', 'body > div:nth-child(1) > p:nth-child(3) > a:nth-child(1)' -s ';MYEXTRASTRING;' | sed 's/\(.*\);MYEXTRASTRING;/\1/'
    

    卷曲部分:

    curl用于下载 http://exmaple.com

    HX选择部件:

    hxselect支持多个CSS选择器。使用 , 分离这些选择器。

    -c: 仅打印内容,不带html标记

    -s: 每次匹配后的分隔符文本。对你来说,是 ;MYEXTRASTRING;

    sed部分:

    因为-s分隔符文本将为每个匹配项添加,这意味着它将添加两次。sed用于删除最后匹配的分隔符文本。