1

我已经尝试使用(并且被建议不要)使用正则表达式来完成这项任务(这里) - 所以我尝试以这种方式使用 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
4

1 回答 1

3

使用它,您可以调用 Lynx,将重定向的 StandardOutput 中的输出抓取到字符串中,而无需先将其写入文件。

using System;
using System.Diagnostics;

namespace Lynx.Dumper
{
  public class Dampler
  {
      public void fdksfjh()
      {
          var url = "http://www.google.com";

          var p = new Process();

          p.StartInfo = new ProcessStartInfo("c:/tools/lynx_w32/lynx.exe", "-dump -nolist " + url)
          {
              WorkingDirectory = "c:/tools/lynx_w32/",
              UseShellExecute = false,
              RedirectStandardOutput = true,
              RedirectStandardError = true,
              WindowStyle = ProcessWindowStyle.Hidden,
              CreateNoWindow = true
          };

          p.Start();
          p.WaitForExit();

          //grab the text rendered by Lynx
          var text = p.StandardOutput.ReadToEnd();

          Console.WriteLine(text);
      }
  }
}
于 2012-11-22T11:53:36.327 回答