我已经尝试使用(并且被建议不要)使用正则表达式来完成这项任务(这里) - 所以我尝试以这种方式使用 HTMLAgilityPack但是它的结果文本非常差,html 列表(<ol><li></ol>
)完全丢失并且只是结果在聚集在一起的段落中。
在这个问题中,我看到 lynx(为 windows 编译)被推荐为一个不错的选择,但是我无法让它工作 - 如何使用 lynx.exe 将 html(存储在 .net 字符串中)转换为可呈现的纯文本带有换行符等的文本字符串。
我能想到的唯一方法是将 html 写入文件,使用 .nets system.process 调用 lynx.exe -dump 并读取结果文件 - 这似乎很笨拙。
有更好的方法吗?对于这样的任务,确切的 lynx.exe 命令行是什么?
我正在使用的 LYNX 实现是这个:
http://invisible-island.net/datafiles/release/lynx-cs-setup.exe
编辑:取得了一些进展,这是我一直在使用的命令行:
lynx.exe -dump "d:\test.html" >d:\output.txt
它有点工作,但如果我在记事本中打开生成的文件,它全部在一行上(因为 lynx 只对新行使用换行符,而记事本需要回车才能正确呈现。
</li>
此外,它在&<br />
标记后插入了太多换行符,它做了两个换行符:
Hello, this is a normal line of text.
Next an ordered list:
1. The
2. Quick
3. Brown Fox
4. Jumped
我可以通过用一个 LF 替换两个连续的 LF 来解决这个问题,但我仍然在使用 ac# 包装器来解决所有这些问题。
编辑 2 - 我基于 Christian 的回答的最终解决方案:
Function ConvertHtmlToPlainText(ByVal HtmlString As String) As String
'#### Define FileBuffer Path
Dim HtmlBuffer As String = WorkingRoot & "HtmlBuffer.html"
'#### Delete any old buffer files
Try
If File.Exists(HtmlBuffer) = True Then
File.Delete(HtmlBuffer)
End If
Catch ex As Exception
Return "Error: Deleting old buffer file: " & ex.Message
End Try
'#### Write the HTML to the buffer file
Try
File.WriteAllText(WorkingRoot & "HtmlBuffer.html", HtmlString)
Catch ex As Exception
Return "Error: Writing new buffer file: " & ex.Message
End Try
'#### Check the file was written OK
If File.Exists(HtmlBuffer) = False Then
Return "Error: HTML Buffer file was not written successfully."
End If
'#### Read the buffer file with Lynx and capture plain text output
Try
Dim p = New Process()
p.StartInfo = New ProcessStartInfo(LynxPath, "-dump -width 1000 " & HtmlBuffer)
p.StartInfo.WorkingDirectory = WorkingRoot
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
p.StartInfo.CreateNoWindow = True
p.Start()
p.WaitForExit()
'#### Grab the text rendered by Lynx
Dim text As String = p.StandardOutput.ReadToEnd()
Return text.Replace(vbLf & vbLf, vbLf)
Catch ex As Exception
Return "Error: Error running LYNX to parse the buffer: " & ex.Message
End Try
End Function