【问题标题】:Parsing JavaScript Web Page in C# with AngleSharp使用 AngleSharp 在 C# 中解析 JavaScript 网页
【发布时间】:2015-08-22 04:15:30
【问题描述】:

网页使用 javascript 来构建它的 html,所以我需要支持 js 的 html 解析器。
我找到了anglesharp,但我不能让它工作。

using AngleSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace AngleSharpScraping
{
    class Program
    {
        static void Main(string[] args)
        {
            GetMkvToolNix();
            Console.ReadKey();
        }

        static async void GetMkvToolNix()
        {
            // Create a new configuration with javascript interpreter.
            var config = new Configuration().WithJavaScript();

            // Parsing process.
            var document = await BrowsingContext.New(config).OpenAsync(Url.Create("http://www.fosshub.com/MKVToolNix.html"));
            var link = document.QuerySelector("body > div.container.page-content > div > div.col-sm-9 > article > div.main-dl-box > p:nth-child(2) > a.dwl-link.xlink").GetAttribute("data");

            Console.WriteLine(link);
        }
    }
}

【问题讨论】:

  • 可能想看看PhantomJS
  • PhantomJS 是一个带有 js api 的外部应用程序。此外,一些防病毒软件将其视为威胁并显示丑陋的警告弹出窗口。

标签: javascript c# web-scraping anglesharp


【解决方案1】:

AngleSharp 仅提供 HTML 和 CSS 解析器。但是,可以使用 JavaScript 功能扩展 AngleSharp。现在您使用的包 (AngleSharp.Scripting.JavaScript) 是实验性的,或多或少是概念验证。

页面上的 JavaScript 文件对于实验性支持来说仍然过于复杂。我努力尽快启用对此类场景的支持,但现在我想说 WebKit.NET 可能是您解决问题的最佳选择。

另一种可能的解决方案是使用 Selenium 的 C# 驱动程序。

与整个 JavaScript 主题无关:如果要加载外部资源,则需要提供适当的 (http) 请求者。最简单的方法是使用默认方法:

var config = new Configuration().WithDefaultLoader();
var document = await BrowsingContext.New(config).OpenAsync("http://www.fosshub.com/MKVToolNix.html");
// ...

在此设置中加载外部文档,但不加载其他资源(例如,图像、脚本等)。

【讨论】:

  • 我之前在 selenium 上遇到过一些奇怪的问题,比如显示浏览器错误或显示防火墙访问对话框。 WebKit.NET 似乎无人维护或死亡。在 NuGet 上,我找到了 CefSharp,但我发现它过于复杂。
  • 我明白了,好吧,坚持下去,我尝试改进对 JS 的支持。这里只有时间是有限的资源。
  • 有人收到Method 'EvaluateScriptAsync' in type 'AngleSharp.Scripting.JavaScript.JavaScriptEngine' from assembly 'AngleSharp.Scripting.JavaScript, Version=0.3.1.26954, Culture=neutral, PublicKeyToken=null' does not have an implementation. 吗?只需运行new Configuration().WithJavaScript() ?使用Configuration.Default.WithJavaScript() 得到同样的结果
【解决方案2】:

AngleSharp 是一个文本解析器。如果你想用 JS 抓取动态网页,你需要一个无头浏览器。

This answer 提供了几个选项(至少一个免费和开源:WebKit.NET)。

【讨论】:

  • AngleSharp 使用 Jint 执行 JavaScript:var config = new Configuration().WithJavaScript(); BrowsingContext 必须像真正的浏览器一样处理会话和 cookie。
猜你喜欢
  • 2017-05-18
  • 2017-10-16
  • 2020-03-31
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2010-10-10
相关资源
最近更新 更多