CodeGo.net>如何使用AngleSharp和LINQ从网站提取数据?
作者:互联网
我正在尝试从下面提到的网站中提取价格.我正在使用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配置开始,该配置定义了浏览引擎可用的功能.该引擎以“浏览上下文”的形式公开,可以视为无头标签.在此选项卡中,我们可以打开一个新文档(从本地源,构造源或远程源).
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接口(例如,导航器,完整历史记录,网络工作者等)-此处的列表是无限的
尽管有一个项目向AngleSharp提供了一个实验性的(并且是有限的)仅C#的JS引擎,但是后两个要求目前无法完全满足.此外,对于一个或另一个Web应用程序,CSSOM可能也不够完整.请记住,这些页面可能是为实际浏览器设计的.他们做出某些假设.他们甚至可能需要用户输入(例如Google Captcha).
长话短说.
var config = Configuration.Default
.WithDefaultLoader()
.WithCss()
.WithJavaScript(); // maybe even more
var context = BrowsingContext.New(config);
打开新文档时,等待背后的任务等效于DOM中的加载事件.因此,当下载并解析文档时,它将不会触发,只有在所有脚本(包括脚本)都已加载(并可能运行)后才会触发.需要下载的资源.
希望这个对你有帮助!
标签:web-scraping,linq,c,anglesharp,data-extraction 来源: https://codeday.me/bug/20191027/1948268.html