度々すみません。下記コードを実行すると日本語の部分が文字化けします。vim
だけでなくvisual studio community 2015
でも同様な症状が出ます。回避方法あればお知恵頂けると嬉しいです。
#r "FSharp.Data.dll"
open FSharp.Data
module Test =
let url = "http://www.aozora.gr.jp/index_pages/person81.html"
let results = HtmlDocument.Load ( url )
results |> printfn "%A"
結果
<tr>
<td class="header">ä½å®¶åèªã¿ï¼</td><td>ã¿ããã ããã</td>
</tr>
HtmlDocument.Load
では文字化けを回避する方法はないように思えます
Http.RequestString
とかを使って文字列としてダウンロードしてからHtmlDocument.Parse
を呼ぶのがいいと思われますが、どうやらそのサイトは適切にリクエストヘッダを指定しないとまともにレスポンス返してくれないっぽいのでがんばってくださいw
encodingStr
とは・・・
例えばこんな感じでアクティブパターン作れば、
let (|HeaderEnum|_|) key =
match key with
| "accept-charset" -> Some HeaderEnum.AcceptCharset
| ...
| _ -> None
意味も明白になる。
match header.ToLowerInvariant() with
| HeaderEnum key -> req.Headers.[key] <- value
| ...
確かめてみた:
> let asyncTest = async {
failwith "hoge"
};;
val asyncTest : Async<unit>
> try asyncTest |> Async.StartImmediate with
| _ as ex -> printfn "%A" ex;;
System.Exception: hoge
場所 <StartupCode$FSharp-Core>.$Control.StartImmediate@1471-1.Invoke(Exception exn)
場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations@1230-1.Invoke(Exception x)
場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
場所 Microsoft.FSharp.Control.AsyncBuilderImpl.startAsync[a](CancellationToken cancellationToken, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont, FSharpAsync`1 p)
場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations[T](CancellationToken token, FSharpAsync`1 a, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont)
場所 Microsoft.FSharp.Control.FSharpAsync.StartWithContinuations[T](FSharpAsync`1 computation, FSharpFunc`2 continuation, FSharpFunc`2 exceptionContinuation, FSharpFunc`2 cancellationContinuation, FSharpOption`1 cancellationToken)
場所 Microsoft.FSharp.Control.FSharpAsync.StartImmediate(FSharpAsync`1 computation, FSharpOption`1 cancellationToken)
場所 <StartupCode$FSI_0009>.$FSI_0009.main@()
val it : unit = ()
> try asyncTest |> Async.Start with
| _ as ex -> printfn "%A" ex;;
val it : unit = ()
> System.Exception: hoge
場所 Microsoft.FSharp.Control.CancellationTokenOps.Start@1224-1.Invoke(Exception e)
場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
場所 <StartupCode$FSharp-Core>.$Control.-ctor@510-1.Invoke(Object state)
場所 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
場所 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
場所 System.Threading.ThreadPoolWorkQueue.Dispatch()
場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
エラーのため停止しました
StartImmediateすると、現在のスレッドを使用して式を実行するので、発生した例外は順当にcatchされる。Startした場合は別のスレッドで実行され、そこで発生した例外を、式外で受ける事は出来ない(?) スレッド死んだことになっているような...
ほんとうに度々すみません。プログラミングF#
の187ページ(例7−11)のようにXML
をパターンマッチにかけて表示させるコードを書きたいです。まずはXML
を表示させようと思いましたが、空のseq
が返ってきます。とくには間違ってないとは思うのですが、、、。ヒントを頂けるとうれしいです。長文すみません。
.
こんな感じでXML/RSS
を取得したい!
<item>
<title>【 29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害</title>
<link>
http://rdsig.yahoo.co.jp/weather/rss/RV=1/RU=aHR0cDovL3dlYXRoZXIueWFob28uY28uanAvd2VhdGhlci9qcC80MC84MjEwLmh0bWw_ZD0yMDE2MDMyOQ--
</link>
<description>晴後曇 - 20℃/8℃</description>
<pubDate>Tue, 29 Mar 2016 05:00:00 +0900</pubDate>
</item>
.
最終的にやりたいことは、、、
<title> .... </title> と挟まれている文字列だけを抜き出したい!
【 29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害
【 30日(水) 福岡(福岡) 】 晴時々曇 - 21℃/12℃ - Yahoo!天気・災害
.
#r @"../lib/FSharp.Data.dll"
#r @"../../System.Xml.dll"
open FSharp.Data
open System.Xml
module Test_XML =
// XML source
let xmlDoc =
let url = "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
let doc = new System.Xml.XmlDocument()
doc.LoadXml (Http.RequestString ( url ) )
doc
xmlDoc |> printfn "%A"
seq
[seq [];
seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]]
xmlDoc.ChildNodes.ItemOf (0) |> printfn "%A"
xmlDoc.ChildNodes.ItemOf (1) |> printfn "%A"
xmlDoc.ChildNodes.ItemOf (2) |> printfn "%A"
seq []
seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]
<null>
//一部のみここでは表示。。。
"<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Yahoo!天気・災害 - 福岡(福岡)の天気</title><link>htt
OuterXml
すればちゃんと読み込めていることがわかるはずです
XmlDocument
じゃなくてXDocument
使ったほうがいい、とかそういう話はあります
open System.Net.Http
open System.Xml.Linq
let asyncFetch (url: string) = async {
use httpClient = new HttpClient()
use! stream = httpClient.GetStreamAsync url |> Async.AwaitTask
return XDocument.Load(stream)
}
[<EntryPoint>]
let main argv =
let doc = asyncFetch "http://rss.weather.yahoo.co.jp/rss/days/8210.xml" |> Async.RunSynchronously
printfn "%A" doc
0