【问题标题】:Is it possible to define a HTML selector that concatenates multiple selectors and separates them by semicolon?是否可以定义一个连接多个选择器并用分号分隔它们的 HTML 选择器?
【发布时间】:2019-01-04 17:53:11
【问题描述】:

我正在尝试使用pup 解析一个简单的 HTML 页面。 这是一个命令行 HTML 解析器,它接受一般的 HTML 选择器。

我要选择:

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

我也想选择:

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

我想连接它们并插入一些自定义文本以获得:

SampleA;MYEXTRASTRING;SampleB

我想避免多次调用 pup,因为它很慢。

我可以选择多个标签:

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

但这会导致:

SampleA
SampleB

有没有比 pup 更好的选择?

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

【问题讨论】:

    标签: html bash pup


    【解决方案1】:

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

    为了达到你的目的,我建议使用 hxselect 命令,该命令可以在 HTML-XML-utils 中找到: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的html内容

    hxselect 部分:

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

    -c:只打印内容,不带html标签

    -s:每次匹配后的分隔符文本。在你的情况下,它是;MYEXTRASTRING;

    sed 部分:

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

    【讨论】:

    • 试试... | hxnormalize -x | hxselect ...? hxnormalize 是 HTML-XML-utils 中的另一个命令,用于对 html 进行规范化
    • 我遵守 hxselect 7.1。它确实显示语法错误。尝试最新版本 7.7,它可以正常工作。
    • 似乎(从 7.7 版开始)hxselect 并不真正支持“多个”逗号分隔的选择器,而只支持两个。当给定两个以上的选择器时,它只考虑第一个和最后一个提供的选择器。谁能确认一下?
    • @SkippyleGrandGourou 似乎是这样,你是对的。它也发生在我身上,中间的选择器被忽略了......
    • @KevinCui Also confirmed here。我找不到 W3C 存储库来报告错误(显然是 they closed their public Bugzilla last April)。
    猜你喜欢
    • 2018-08-10
    • 2011-05-13
    • 2019-04-21
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2012-10-07
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多