2013-02-24 2 views
0

Я хотел бы проанализировать HTML-документ и распечатать каждый из абзацев в файл журнала как отдельную запись. До сих пор у меня есть:f # split html по тегам

let parseTextFile (path) = 
     let fileText = File.ReadAllText(path) 
     fileText.Split('<p>') |> Seq.iter (fun m -> logEmail(m)) 

Но, к сожалению, для меня String.split не делать то, что я хочу здесь, кажется, существуют, чтобы разбить строку на один символ разделитель. Как я могу разбить файл, используя что-то большее, чем один символ, может быть приятно иметь что-то большее, чем просто < p>, а потому, что при этом у меня будет </p> в конце абзаца. С регулярным выражением или каким-то сложным совпадением я мог бы более точно выделить все между < p> тегами.

+0

Взгляните на эту перегрузку: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx – wmeyer

ответ

1

Как сказал wmeyer, вам нужно использовать другую перегрузку метода .Split() на строках. Фактически, код, который вы отправили, даже не компилируется, потому что '<p>' не является строковым литералом - вместо этого вам нужно использовать "<p>" (одинарные кавычки предназначены для символьных литералов).

Вот как использовать правильную перегрузку .Split():

open System.IO 

let parseTextFile path = 
    let fileText = File.ReadAllText path 
    fileText.Split ([| "<p>"; |], System.StringSplitOptions.RemoveEmptyEntries) 
    |> Seq.iter logEmail 

Для быстрой проверки в F # Interactive:

> "First paragraph<p>Second paragraph.<p><p>Third paragraph.<p>" 
    .Split ([| "<p>"; |], System.StringSplitOptions.RemoveEmptyEntries);; 
val it : string [] = 
    [|"First paragraph"; "Second paragraph."; "Third paragraph."|] 

Наконец, как @ntr сказал - ты много, много лучше использовать библиотеку, такую ​​как HTML Agility Pack для разбора HTML. Их синтаксические анализаторы очень надежны и сэкономит вам массу неприятностей.

5

Попробуйте использовать определенные библиотеки для разбора html, например HtmlAgilityPack.

Смежные вопросы