1

WebClient.Net のクラスを使用して Web ページをダウンロードし、タイトル (つまり と の間<title>にあるもの</title>) を抽出して、ページをファイルに保存したいと思います。

問題は、ページが UTF-8 でエンコードされており、System.IO.StreamWriterそのような文字を含むファイル名を使用すると例外がスローされることです。

私はググって、UTF8をANSIに変換するいくつかの方法を試しましたが、役に立ちませんでした。誰かがこれのための作業コードを持っていますか?

'Using WebClient asynchronous downloading
Private Sub AlertStringDownloaded(ByVal sender As Object, 
                                  ByVal e As DownloadStringCompletedEventArgs)
    If e.Cancelled = False AndAlso e.Error Is Nothing Then
        Dim Response As String = CStr(e.Result)

        'Doesn't work               
        Dim resbytes() As Byte = Encoding.UTF8.GetBytes(Response)
        Response = Encoding.Default.GetString(Encoding.Convert(Encoding.UTF8, 
                                              Encoding.Default, resbytes))

        Dim title As Regex = New Regex("<title>(.+?) \(", 
                                       RegexOptions.Singleline)
        Dim m As Match
        m = title.Match(Response)
        If m.Success Then
            Dim MyTitle As String = m.Groups(1).Value

            'Illegal characters in path.
            Dim objWriter As New System.IO.StreamWriter("c:\" & MyTitle & ".txt")
            objWriter.Write(Response)
            objWriter.Close()
        End If
    End If
End Sub

編集:助けてくれてありがとう。エラーの原因は UTF8 ではなく、ページのタイトル セクションにある隠された LF 文字であることがわかりました。これは明らかにパス内の不正な文字です。


編集: ファイル名/パス内の不正な文字の一部を削除する簡単な方法は次のとおりです。

Dim MyTitle As String = m.Groups(1).Value
Dim InvalidChars As String = New String(Path.GetInvalidFileNameChars()) + New String(Path.GetInvalidPathChars())
For Each c As Char In InvalidChars
    MyTitle = MyTitle.Replace(c.ToString(), "")
Next

編集:そして、WebClientにUTF-8を期待するように指示する方法は次のとおりです:

Dim webClient As New WebClient
AddHandler webClient.DownloadStringCompleted, AddressOf AlertStringDownloaded
webClient.Encoding = Encoding.UTF8
webClient.DownloadStringAsync(New Uri("www.acme.com"))
4

1 に答える 1

1

問題はUTF-8に関連しているとは思わない。</title>同じ行に表示される場合、正規表現に含まれると思います。文字<>は Windows ファイル名では無効です。

これが問題でない場合は、 の入力値と出力値のサンプルを確認すると役立ちますMyTitle

于 2013-01-07T11:59:42.060 に答える