Parsing 如何使用REBOL解析内部HTML标记?

Parsing 如何使用REBOL解析内部HTML标记?,parsing,rebol,Parsing,Rebol,我有一个加载了load/markup的网页。我需要从中解析出一些东西,但是一些数据在标签中。有什么办法可以解析它吗?以下是我迄今为止所得到(并尝试过)的一个示例: 我想看到更像: Bob Sockaway bsockaway@example.com 9999 有什么想法吗?谢谢 注意!值得一提的是,我提出了一个很好的简单规则集,可以获得预期的结果: rules: [ some [ <td> any [tag!] s: string! (print s/1)

我有一个加载了load/markup的网页。我需要从中解析出一些东西,但是一些数据在标签中。有什么办法可以解析它吗?以下是我迄今为止所得到(并尝试过)的一个示例:

我想看到更像:

Bob Sockaway
bsockaway@example.com
9999
有什么想法吗?谢谢

注意!值得一提的是,我提出了一个很好的简单规则集,可以获得预期的结果:

rules: [
    some [
        <td> any [tag!] s: string! (print s/1) any [tag!] </td> |
        tag! | string! ; Catch any leftovers.
    ]
]
规则:[
一些[
任意[tag!]s:string!(打印s/1)任意[tag!]|
标记!|串!;抓住任何剩菜。
]
]

当使用
LOAD/MARKUP
处理
mess
时,您会得到以下结果(我已经用类型格式化并注释):

但您还想知道,从本质上讲,您是否可以在同一组规则中从块解析转换为字符串解析(而无需跳转到开放代码)。我调查了一下,“混合解析”看起来可能是REBOL3中提到的一个特性。不过,我还是无法让它在实践中发挥作用。所以我问了自己一个问题


我想我找到了一个很好的解决办法。如果你有很多不同的标签,它们的属性是你需要的,那么它可能必须被推广

我正在查找查询标记的id属性!:

<query id="5">
要查看更多的标签,我将使用用例。也许这会更好地设置

to-integer select p 'id=
我最终需要解析另一个标记,这是一个很好的通用模式

switch p/1 [
  field [_fid: to-integer p/id= _field_type: p/field_type=]
  query [_qid: to-integer p/id=]
]

我将不得不把这个分成两条评论,因为苏讨厌我。。。谢谢你详细的回答!这并不是我想要的(我的错!),但它确实解决了前面提到的问题。我希望找到如何在标签中解析!因此,我可以从标记的各种可能参数中获得有用的信息。也就是说,如果标签!is
如果能够解析出href字符串的内容,而不是“a”标记之间的内容,那就太好了。在规则中初始化td计数是一个很好的技巧,我没有想到要像您所描述的那样维护解析状态。然而,这里有一个更优雅的公式,它不需要额外的变量:
规则:[some[any[tag!]s:string!(print s s/1)any[tag!]| tag!| string!]
对不起,格式太糟糕了。显然,评论不是一流的公民…;-)您的解析规则可以工作,并且在嵌套表上具有特定的语义,这取决于您希望在这些情况下发生什么。在任何情况下,我都有一个问题的链接,我问了一个问题,试图跟进你在标题中提出的问题…@HostileFork我试图使用count,规则解析是正确的,但没有插入不作为一般规则工作的内容,你应该避免奇怪的标记,例如commentsproof of concept:aa:load/markup{}parse aa[some][设置t标签!(p:make block!t开关p/1[!--[打印选择p'=])|字符串!]]
rules: [
    (td-count: 0)
    some [
        ; if we see an open TD tag, increment a counter
        <td> (++ td-count)
        |
        ; if we see a close TD tag, decrement a counter
        </td> (-- td-count)
        |
        ; capture parse position in s if we find a string
        ; and if counter is > 0 then print the first element at
        ; the parse position (e.g. the string we just found) 
        s: string! (if td-count > 0 [print s/1])
        |
        ; if we find any non-TD tags, match them so the
        ; parser will continue along but don't run any code
        tag!
    ]
]
Bob Sockaway
bsockaway@example.com
9999
<query id="5">
  | set t tag! (
    p: make block! t 
    if p/1 = 'query [_qid: to-integer p/3]
  )
to-integer select p 'id=
switch p/1 [
  field [_fid: to-integer p/id= _field_type: p/field_type=]
  query [_qid: to-integer p/id=]
]