Лучший способ разобрать это в Реболе - PullRequest
0 голосов
/ 30 апреля 2011

Как мне извлечь дату и время получения транзакции с наименьшим количеством шума в моем правиле разбора из следующего HTML-кода? (Вывод, который я ищу, таков: "Квитанция о транзакции: 28.04.2011 17:03:09" )

 <FONT COLOR=DARKBLUE>Transaction Receipt </FONT></TH></TR><TR></TR><TR></TR><TR><TD COLSPAN=4 ALIGN=CENTER><FONT SIZE=-1 COLOR=DARKBLUE>04/28/2011 17:03:09</FONT>

Следующие работы, но я не чувствую себя хорошо! Гарантируется, что после слов «Транзакция» где-то будет дата и время (хотя я не буду делать жадный матч, если буду делать grep)

parse d [
    thru {<FONT COLOR=DARKBLUE>Transaction Receipt </FONT></TH></TR><TR></TR><TR></TR><TR><TD COLSPAN=4 ALIGN=CENTER><FONT SIZE=-1 COLOR=DARKBLUE>}
    copy t to "</FONT>"
    ]

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Своевременно, как обычно: если формат соответствует, вы всегда можете попытаться явно сопоставить даты:

rule: use [dg tag date value][
    tag: use [chars][
        chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" " =-"]
        ["<" opt "/" some chars ">"]
    ]

    date: use [dg mo dy yr tm][
        dg: charset "0123456789"
        [
            copy mo [2 dg "/"] copy dy [2 dg "/"] copy yr 4 dg
            " " copy tm [2 dg ":" 2 dg ":" 2 dg]
            (value: load rejoin [dy mo yr "/" tm])
        ]
    ]

    [
        some [
              "Transaction Receipt" (probe "Transaction Receipt")
            | date (probe value)

            ; everything else
            | some " " | tag ; | skip ; will parse the whole doc...
        ]
    ]
]
1 голос
/ 30 апреля 2011

Это короче ...

parse d [thru <FONT SIZE=-1 COLOR=DARKBLUE> copy t to </FONT>]

, но специально не ищет пару datetime. И, к сожалению, REBOL считает использованную дату недействительной ...

>> 04/28/2011
** Syntax Error: Invalid date -- 04/28/2011
** Near: (line 1) 04/28/2011

так что вы не можете найти его специально. Если бы дата была 28/04/2011 (и после времени был пробел, хотя я не уверен, зачем он нужен для загрузки), сработало бы следующее ...

parse load d [to date! copy t to </FONT>]

Хм. Попробуйте это ...

t: ""
parse d [
    some [
        to "<" thru ">" mark: copy text to "<" (if text [append t text]) :mark
    ]
]

Возвращается: «Квитанция о транзакции от 28.04.2011 17:03:09»

Он работает, пропуская все теги, добавляя любой текст, оставленный т.

Надеюсь, это поможет!

...