【问题标题】:HTML parsing using c#使用 c# 进行 HTML 解析
【发布时间】:2012-07-12 05:08:50
【问题描述】:

我正在开发一个asp.net 网站。我需要使用c# 替换html 中的特定字符串。以下是html。 在这里,我需要使用 c# 代码将“@name”替换为有效名称。 我尝试使用 java 脚本。它正在工作。我如何使用 c# 来实现这一点?

如何使用 c# 或 HtmlAgilityPack 获取当前页面的 HTML 以对其进行解析?

HTML:

<div>
In the @name, you may have configured an iPad in both the AppleDevices and the TabletDevices configuration. However, because AppleDevices may have been set for a small display size, you want an iPad to use the TableDevices configuration (which has a larger screen). Reorder the devices in the following order so that an iPad will use the TableDevices configuration first.
Tablet Devices
Apple Devices
</div>

【问题讨论】:

  • "我如何获取当前页面的 HTML" 如果您使用的是 WebForms、MVC、NancyFX,您还没有告诉我们...

标签: c# html string replace html-agility-pack


【解决方案1】:
var result = html.Replace("@name", valid_name)

【讨论】:

  • 如何将当前页面的 html 加载到 HtmlAgilitypack 的 HtmlDocument 中?
  • stackoverflow.com/q/5599012/1475234 - 此链接有类似的问题。但无法获取当前页面 html。
【解决方案2】:

最简单的方法是使用String.Replace(String, String)方法:

string newString = html.Replace("@name", "valid name");

【讨论】:

  • 如何将当前页面的 html 加载到 HtmlAgilitypack 的 HtmlDocument 中?
  • @NewBornDeveloper - 要么使用 HtmlWeb 从网络加载(它需要一个 URL),要么使用 HtmlDocument 从本地路径加载。
  • 我尝试使用 var hw = new HtmlWeb(); HtmlDocument doc = hw.Load(Request.Url.ToString());但没有运气!
【解决方案3】:

如果只是这个替换,你可以使用 string.Replace();

您的代码看起来像一个 html 模板。 如果您的变量列表会增加,我强烈建议使用 Razor 作为模板引擎, 您可以在其中获得静态输入、html 表格中的智能感知和其他功能。

【讨论】:

    【解决方案4】:
    string htmlContent=@"<div>In the @name, you may have configured an iPad in both the AppleDevices and the TabletDevices configuration. However, because AppleDevices may have been set for a small display size, you want an iPad to use the TableDevices configuration (which has a larger screen). Reorder the devices in the following order so that an iPad will use the TableDevices configuration first.
    Tablet Devices
    Apple Devices
    </div>";
    string htmlNewContent=htmlContent.Replace("@name",valid_name);
    

    【讨论】:

      【解决方案5】:

      假设这是 MVC,请查看我的 CsQuery 项目。 CsQuery 是一个 jQuery 端口和 CSS 选择器引擎,您可以使用它直接处理 HTML。但更重要的是,该项目包含一个示例,其中包含在 MVC 下以 C# 呈现页面之前访问页面 HTML 的代码。

      访问局部视图非常简单,请参阅 Rick Strahl 的 blog post 主题。

      但是,如果您想访问页面的整个 HTML 并可能在呈现之前对其进行更改,则需要创建自定义 ViewEngine,并回调到您将能够访问 HTML 的控制器。正确地做到这一点涉及很多。与其复制数百行代码,不如看看 CsQuery 中包含的示例 MVC 应用程序,特别是 CsQueryView 文件夹中的类:

      https://github.com/jamietre/CsQuery/tree/master/examples/CsQuery.MvcApp

      这包括一个自定义视图引擎和一个自定义 Controller 基类,可让您向控制器添加方法,如下所示:

      // runs for all actions
      public void Cq_Start()
      {
          Doc["a.not-allowed"]
              .Attr("onclick","javascript:alert('You're not authorized to click this')");
      }
      
      // runs for the Index action
      public void Cq_Index()
          Doc["div"].Css("border", "1px solid red;");
      }
      

      这些方法在对应的常规操作方法之后调用,并设置Doc的值。 Doc 是一个CQ 对象(CsQuery 中的核心对象)。这包含页面的所有 HTML。它就像一个 jQuery 对象。在您的情况下,您可以使用 jQuery 方法,例如:

      // select all divs on the page
      var div = Doc["div"];
      
      // do parameter substitution
      var newText = div.Text().Replace("@name", valid_name);
      
      // update the text
      div.Text(newText);
      

      要切换您的 MVC 应用以使用此视图引擎,您需要将此代码添加到 Application_Start

      ViewEngines.Engines.Clear();
      ViewEngines.Engines.Add(new CsQueryViewEngine());
      

      但是,如果不想使用 CsQuery,该示例应该向您展示如何在 MVC 中访问 HTML 输出,然后再呈现。它使用反射来找出在控制器中回调的方法,并且可以很容易地调整它以提供 HTML 字符串而不是 CsQuery 对象。

      【讨论】:

      • 不知道怎么联系你,我觉得这个地方是联系你最好的方式。我使用 Jsoup 在 Java 中创建了一个项目,它解析 HTML 并制作 DOM 树,并且我在各种操作中使用了它,就像比较两个 URL 的模板一样。但问题是 Jsoup 没有获取给定 HTML(URL) 的动态内容。那么如何使用 Jsoup/CSquery 来做到这一点呢?我在 git 中看到了你的项目。但是没有教程/示例。所以请帮我解决我的问题。我的问题是,stackoverflow.com/questions/15805976/…
      • CsQuery 是一个 .NET 库,而 Jsoup 是一个 Java 库。你用的是哪个环境?另外我很抱歉文档有点薄弱,但是examples 文件夹下的 CsQuery git 存储库中有两个示例项目,文档涵盖了加载 HTML 的基础知识;如果您需要有关使用 jQuery 方法的更多详细信息,请参阅 jQuery 文档,大部分功能都反映了 jQuery。此外,如果您只是在 Stack Overflow 上搜索 csquery 标记,就会有许多 Q&A 以及许多常见用途的具体示例。
      • 哦,我正在使用 Netbeans 和 maven。那你能告诉我如何获得动态页面吗?我有一个想法,WebDriver driver = new FirefoxDriver(); driver.get(url1); 运行这些命令(使用 Selenium)并将内容存储在文件/字符串中,然后使用 Jsoup 解析(这部分已经由我完成)。你能告诉我如何使用 selenium 复制动态内容。
      • 对不起,我帮不了你。 CsQuery 仅适用于 .NET。
      猜你喜欢
      • 2012-04-06
      • 2016-01-16
      • 2012-09-03
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多