【问题标题】:Evaluating javascript using AngleSharp使用 AngleSharp 评估 javascript
【发布时间】:2020-10-05 23:00:29
【问题描述】:

我正在尝试在执行查询之前评估页面上的 javascript,因为我要查找的 html 不存在于 AngleSharp 文档中。

有一个方法:document.ExecuteScript(string)

但与我看到的其他库相比,我不知道如何使用它。例如,一些python代码看起来像这样......

wait.until(presence_of_element_located((By.ID, "class-name")))

我猜这只是暂停代码,直到评估整个页面。然后可以搜索元素。

在 AngleSharp 中,我似乎必须运行 ExecuteScript 方法来做同样的事情。但它只是抛出一个异常(Jint.Runtime.JavaScriptException: 'results is not defined')并返回一个对象作为结果——这完全是混淆的,根本没有帮助。

我该怎么做才能让我的下一个命令:

IHtmlCollection<IElement> cells = document.QuerySelectorAll(s);

实际上是查看整个文档,而不仅仅是最初的 HTML?

【问题讨论】:

    标签: javascript c# html screen-scraping anglesharp


    【解决方案1】:

    我认为这里不止一个问题。所以我会分解它。

    首先,让我们在这里了解一些基础知识:

    1. AngleSharp 是浏览器核心 - 它不是浏览器,也不是 JS 引擎。
    2. AngleSharp 提供了扩展它的能力,例如,一个 JS 引擎。 AngleSharp.Js 就是这样一个基于 Jint 的引擎,但是它仍然是实验性的和复杂的脚本,肯定不会运行。
    3. 在我们进入事件循环和异步加载详细信息之前,我建议确保您希望运行的任何脚本都能真正运行。

    现在进入细节:

    ExecuteScriptAngleSharp.Js 的一个小助手,它实际上运行您提供的一段 JS 代码。我想这根本不是你想要的。

    如果你只是想“等待”直到有东西出现,你可以用几行 C# 代码做到这一点:

    var maxTime = TimeSpan.FromSeconds(1.5);
    
    var totalTime = TimeSpan.Zero;
    var pollTime = TimeSpan.FromMilliseconds(25);
    
    while (totalTime < maxTime)
    {
        await Task.Delay(pollTime.Milliseconds);
        
        // check condition
        if (document.QuerySelector(".foo.bar") != null)
        {
            // run zoned code
            break;
        }
        
        totalTime += pollTime;
    }
    
    

    AngleSharp.Js其实有多种方法可以进入事件循环,即等到JS完成当前工作。

    例如,WaitUntilAvailable() 可用于等待加载事件(及相关事件)处理完毕。

    添加了Then() 扩展方法来排队某些操作。所有这些扩展方法都直接存在于IDocument 实例上。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2013-05-06
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多