gpt4 book ai didi

c# - 如何使用 AngleSharp & LINQ 从网站中提取数据?

转载 作者:行者123 更新时间:2023-11-30 14:52:09 28 4
gpt4 key购买 nike

我正在尝试从下面提到的网站中提取价格。我正在使用 AngleSharp用于提取。在网站上,价格列在下面(作为示例):

<span class="c-price">650.00                            </span>

我正在使用以下代码进行提取。

using AngleSharp.Parser.Html;
using System.Net;
using System.Net.Http

//Make the request
var uri = "https://meadjohnson.world.tmall.com/search.htm?search=y&orderType=defaultSort&scene=taobao_shop";
var cancellationToken = new CancellationTokenSource();
var httpClient = new HttpClient();
var request = await httpClient.GetAsync(uri);
cancellationToken.Token.ThrowIfCancellationRequested();

//Get the response stream
var response = await request.Content.ReadAsStreamAsync();
cancellationToken.Token.ThrowIfCancellationRequested();

//Parse the stream
var parser = new HtmlParser();
var document = parser.Parse(response);

//Do something with LINQ
var pricesListItemsLinq = document.All
.Where(m => m.LocalName == "span" && m.ClassList.Equals("c-price"));
Console.WriteLine(pricesListItemsLinq.Count());

但是,我没有收到任何元素,但它们在网站上。我究竟做错了什么?如果AngleSharp不是推荐的方法,我应该使用什么?我应该使用什么代码?

最佳答案

我在聚会上迟到了,但我试着在这里保持理智。

查询静态网页

为此,我们需要以下工具/功能集:

  • HTTP 请求者(通过 HTTP 获取资源,例如 HTML 文档),可能在顶部有一个 SSL/TLS 层(接受所有证书或针对证书存储/已知的 CA)
  • HTML 解析器
  • 已解析 HTML 文档的可查询对象模型表示
  • 也许还有一些 cookie 状态和跟踪链接/发布表单的能力

AngleSharp为我们提供了所有这些选项(减去与证书存储/已知 CA 的连接;因此为了使用 HTTPS,我们必须进行一些额外的配置,例如,接受所有证书)。

我们将从创建一个 AngleSharp 配置开始,该配置定义浏览引擎可用的功能。该引擎以“浏览上下文”的形式公开,可以将其视为 headless 选项卡。在此选项卡中,我们可以打开一个新文档(来自本地源、构造源或远程源)。

var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync("http://example.com");

一旦我们有了文档,我们就可以使用 CSS 查询选择器来获取某些元素。这些元素可用于收集我们寻找的信息。

AngleSharp 包含 LINQ(或一般的 IEnumerable),但是,如果可能的话,为查询提供全部功能是有意义的。

所以代替

var pricesListItemsLinq = document.All
.Where(m => m.LocalName == "span" && m.ClassList.Equals("c-price"));

我们写

var pricesListItemsLinq = document.QuerySelectorAll("span.c-price");

这也更加健壮(ClassList 无论如何都是一个复杂的对象,可以访问类列表,所以你的意思是 ClassList.Contains ClassName.Equals(后者是字符串表示) 注意:这两个版本并不等价,因为前者是在类列表中寻找一个类,而后者是寻找整体的匹配类序列化(因此在匹配上设置了一些额外的边界条件;它需要是唯一的类)。

处理动态页面

这要复杂得多。基础知识与以前相同,但引擎需要提供的不仅仅是前面提到的要求。此外,我们需要

  • JavaScript 引擎
  • 有效的 CSSOM
  • 一个假的(甚至是完全计算的)渲染树
  • 可以在真实浏览器中找到更多的 DOM 接口(interface)(例如,导航器、完整历史记录、网络 worker 等)- 这里的列表是无限的

虽然有一个项目向 AngleSharp 提供实验性(和有限的)纯 C# JS 引擎,但后两个要求目前无法完全满足。此外,CSSOM 对于一个或另一个 Web 应用程序来说可能还不够完整。请记住,这些页面可能是为真实浏览器设计的。他们做出某些假设。它们甚至可能需要用户输入(例如 Google Captcha)。

长话短说。

var config = Configuration.Default
.WithDefaultLoader()
.WithCss()
.WithJavaScript(); // maybe even more
var context = BrowsingContext.New(config);

打开新文档时await后面的Task相当于DOM中的一个load事件。因此它不会在文档被下载和解析时触发,但只有在所有脚本都已加载(并可能运行)后才会触发,包括。需要下载的资源。

希望对您有所帮助!

关于c# - 如何使用 AngleSharp & LINQ 从网站中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427674/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com