【问题标题】:Capture text from an Aspx page从 Aspx 页面捕获文本
【发布时间】:2021-07-22 15:41:05
【问题描述】:

我正在尝试想出一个简洁的解决方案来在我的 aspx pages 上创建自动化的 json 架构标记。有问题的标记是 FAQPage,但这无关紧要。

我决定我需要抓取当前页面的内容以查找问题和答案。在一些错误的开始之后,我遇到了 HtmlAgilityPack 插件,它使我能够实现我想要的,但我遇到了一些问题。

可以通过多种方式启动 HtmlAgililtyPack 解析器,但唯一可以为我和我的场景(抓取当前页面)工作的方式是输入一个字符串。

首先,我创建了一个asp ID with a runat="server" 标签。

为了获取字符串,我使用了 HTMLTextWriter;这是代码:

    static string ConvertControlToString(Control ctl)
    {
        string s = null;

        var sw = new StringWriter();
        using (var w = new HtmlTextWriter(sw))
        {
            ctl.RenderControl(w);
            s = sw.ToString();
        }
        return s;
    }

现在,一切正常 - 在大多数情况下。

但是,我遇到了使用脚本管理器和更新面板的极端情况。我怀疑还会有更多。错误是:... must be inside a form control with a runat="server"。当然可以,但是rendercontrol没有意识到。

那么,两个问题:

  1. 有没有办法以另一种方式提供 HtmlAgilityPack 解析器 需要一个字符串(并且不会循环)?
  2. 除了 Control.RenderControl() 之外,还有其他不会导致错误的更好的方法来抓取文本吗?

顺便说一句,我找到了解决我遇到的问题的方法,但它涉及操纵每个受影响的页面,这不是很好。

所以,我想我会把它扔出去,看看是否有更好的解决方法或更好的解决方案。

【问题讨论】:

    标签: asp.net web-scraping html-agility-pack


    【解决方案1】:

    您可以通过几种不同的方式加载 HTML,但最终 HTML 是一个字符串,因此解析器将对其进行操作。我不确定你所说的循环是什么意思。

    与其将控件呈现为 HTML,然后对其进行解析,不如让整个页面加载并在呈现后对其进行解析,这可以让您的 javascript/updatepanels 在解析 HTML 之前完成页面转换。

    LoadFromBrowser 方法(我相信)在无头浏览器中加载指定的 url,允许任何 javascript 运行,然后解析生成的 HTML:https://html-agility-pack.net/from-browser

    如果您需要附加身份验证凭据,这里有一个问题:HtmlAgilityPack and Authentication

    或者(保留现有代码)您可以尝试使用标签“form”实例化一个新的 HtmlControl,将传递给 ConvertControlToString 的控件添加到其中,然后解析可能避免错误的内容。您可能需要检查控件是否还没有表单标签,这种方法不能解决 javascript/更新面板,我不能 100% 确定它会起作用。

    HtmlGenericControl form = new HtmlGenericControl("form");
    Control ctl = new Control();
    form.Controls.Add(ctl);
    string s = string.Empty;
    var sw = new System.IO.StringWriter();
    using (var w = new HtmlTextWriter(sw))
    {
        form.RenderControl(w);
        s = sw.ToString();
    }
    

    【讨论】:

    • 感谢您的彻底回复。我无法让浏览器方法的负载正常工作 - 它不断挂起(可能是循环)。
    • 其他方法有什么运气吗?我已经用一些示例代码更新了答案。我无法复制该错误(可能是因为我的示例控件没有内容),但代码有望通过我建议的方法。
    • 我现在明白了。这是我永远不会想到的,所以我会试一试。再次感谢。
    • 不,假表单不起作用 - 仍然会收到相同的“需要在带有 runat=server 的表单中”消息。
    • 在渲染时抛出错误的控件的底层类型是什么?
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多