如何使用AngleSharp从网站中提取数据LINQ
本文关键字:提取 数据 LINQ 网站 何使用 AngleSharp | 更新日期: 2023-09-27 18:11:39
我正试图从下面提到的网站提取价格。我使用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解析器/gh>
- 已解析HTML文档的可查询对象模型表示
- 可能还需要一些cookie状态和跟踪链接/发布表单的能力
AngleSharp给了我们所有这些选项(减去与证书存储/已知ca的连接;所以为了使用HTTPS,我们必须做一些额外的配置,例如,接受所有的证书。
我们首先创建一个AngleSharp配置,定义浏览引擎可以使用哪些功能。该引擎以"浏览上下文"的形式公开,可以将其视为无头标签。在这个选项卡中,我们可以打开一个新文档(从本地源、构造源或远程源)。
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接口(例如,导航器,完整历史记录,web 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
事件。因此,它不会在文档被下载和解析时触发,而只会在所有脚本被加载(并可能运行)时触发,包括需要下载的资源。
希望这对你有帮助!