网页使用javascript来构建其html所以我需要支持js的html解析器.
我发现了角度锐利,但我不能让它起作用.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud) 无论如何都要让AngleSharp 在解析片段时不创建完整的HTML文档.例如,如果我解析:
<title>The Title</title>
Run Code Online (Sandbox Code Playgroud)
我得到一个完整的HTML文档DocumentElement.OuterHtml
:
<html><head><title>The Title</title></head><body></body></html>
Run Code Online (Sandbox Code Playgroud)
如果我解析:
<p>The Paragraph</p>
Run Code Online (Sandbox Code Playgroud)
我得到另一个完整的HTML文档:
<html><head></head><body><p>Hey</p></body></html>
Run Code Online (Sandbox Code Playgroud)
请注意,AngleSharp足够聪明,可以知道我的片段应该去哪里.在一种情况下,它将它放在HEAD
标签中,而在另一种情况下,它将它放在BODY
标签中.
这很聪明,但如果我只想让片段退出,我不知道从哪里得到它.所以,我不能只是调用Body.InnerHtml
因为根据我解析的HTML,我的片段可能在其中Head.InnerHtml
.
有没有办法让AngleSharp不能创建一个完整的文档,还是有其他方法可以在解析后将我的孤立片段退出?
我想尝试我的手和webscraping.我注意到Anglesharp非常适合.Net环境.我正在尝试从yelp网站获取所有描述和评级的列表,我不会收到任何错误或任何结果.这是html的一部分(在" https://www.yelp.ca/biz/walmart-toronto-12 "中更详细):
<div class="rating-very-large">
<i class="star-img stars_2" title="2.0 star rating">
<img alt="2.0 star rating" class="offscreen" height="303" src="//s3-media4.fl.yelpcdn.com/assets/srv0/yelp_styleguide/c2252a4cd43e/assets/img/stars/stars_map.png" width="84">
</i>
<meta itemprop="ratingValue" content="2.0">
</div>
<p itemprop="description" lang="en">This Walmart still terrifies me<br><br>Baby things can be found on the back right of the lower level. Godspeed.</p>
<div class="rating-very-large">
<i class="star-img stars_1" title="1.0 star rating">
<img alt="1.0 star rating" class="offscreen" height="303" src="//s3-media4.fl.yelpcdn.com/assets/srv0/yelp_styleguide/c2252a4cd43e/assets/img/stars/stars_map.png" width="84">
</i>
<meta itemprop="ratingValue" content="1.0">
</div>
<p itemprop="description" lang="en">Wow I don't even know where to begin, </p>
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
var config = …
Run Code Online (Sandbox Code Playgroud) 当您没有要使用的类名或ID时,找不到使用AngleSharp进行解析的许多示例.
HTML
<span><a href="google.com" title="Google"><span class="icon icon_none"></span></a></span>
<span><a href="bing.com" title="Bing"><span class="icon icon_none"></span></a></span>
<span><a href="yahoo.com" title="Yahoo"><span class="icon icon_none"></span></a></span>
Run Code Online (Sandbox Code Playgroud)
我想从任何<a>
标题= Bing的标签中找到href
在Python BeautifulSoup我会用
item_needed = a_row.find('a', {'title': 'Bing'})
Run Code Online (Sandbox Code Playgroud)
然后抓住href属性
或jQuery
a[title='Bing']
Run Code Online (Sandbox Code Playgroud)
但是,我坚持使用AngleSharp,例如.以下示例 https://github.com/AngleSharp/AngleSharp/wiki/Examples#getting-certain-elements
c#AngleSharp
var parser = new AngleSharp.Parser.Html.HtmlParser();
var document = parser.Parse(@"<span><a href=""google.com"" title=""Google""><span class=""icon icon_none""></span></a></span>< span >< a href = ""bing.com"" title = ""Bing"" >< span class=""icon icon_none""></span></a></span><span><a href = ""yahoo.com"" title=""Yahoo""><span class=""icon icon_none""></span></a></span>");
//Do something with LINQ
var blueListItemsLinq = document.All.Where(m => m.LocalName == "a" && //stuck);
Run Code Online (Sandbox Code Playgroud) 我可以创建一个private static readonly HtmlParser HtmlParser = new HtmlParser();
并在多个线程中安全地使用它吗?
或者我应该为每个线程或每个使用创建一个解析器以避免并发问题?
我目前正在使用 AngleSharp 构建一个用于网络自动化的应用程序。我已成功登录网站,但无法使用 context.Active.QuerySelectorAll 找到我要查找的元素。
我知道这可能是因为某些 JavaScript 尚未在我正在搜索的 HTML 中运行,按照此链接:Is the HTML shown via 'View Source' different from the HTML shown in (Firebug) Developer Tools?
在查找特定元素之前,如何强制 AngleSharp 执行所有 JavaScript?
代码:
var config = AngleSharp.Configuration.Default.WithDefaultLoader().WithCookies().WithJavaScript().WithCss();
var browsingContext = BrowsingContext.New(config);
await browsingContext.OpenAsync("https://users.premierleague.com/");
await browsingContext.Active.QuerySelector<IHtmlFormElement>("form[action='/accounts/login/']").SubmitAsync(new
{
login = "abc@gmail.com",
password = "password"
});
await browsingContext.OpenAsync("https://fantasy.premierleague.com/a/team/my/");
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切工作正常,我可以确认我已登录。但是,我似乎无法获得以下返回的值:
var x = browsingContext.Active.QuerySelectorAll("*").Where(m => m.ClassName == "ismjs-link ism-link ism-link--more");
Run Code Online (Sandbox Code Playgroud)
我知道这个元素存在,因为我已经通过 Google Chrome 上提供的“检查”功能检查了多次。
我缺少什么/如何让 JavaScript 运行?
谢谢!
我有一个旧版应用程序在旧的 Windows 2008 R2 服务器上运行。该应用程序经历了许多 .Net 版本,目前在 4.7.2 上。多年来,它一直稳定如磐石,虽然有迁移计划以摆脱旧的物理服务器,但它必须存活一段时间。
一项新功能表明需要一些 HTML 抓取。我为 AngleSharp v0.12.0 添加了 NuGet 包,经过单元测试,在我的 Win10 开发机器上一切正常。使用 AngleSharp 的新类很简单。
所以我部署到 prod 服务器,包括对 app.config 的更改;
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
这些是我可以从旧版本中识别出的唯一更改。
当我在生产中运行该应用程序时,它崩溃了。
System.IO.FileLoadException: Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the …
Run Code Online (Sandbox Code Playgroud) 我正在使用AngleSharp解析HTML5,我正在做的是用一些HTML包装我想要解析的元素,使其成为有效的HTML5然后使用解析器,是否有更好的做法它?意思是,直接解析特定元素并验证结构确实是HTML5?
我想知道是否可以使用 AngleSharp 从 HTMLDocument 中提取格式化文本。我正在使用以下代码来提取文本。我遇到的问题是提取的文本一起运行,每个元素之间没有中断。
var parser = new HtmlParser();
var document = parser.Parse("<script>var x = 1;</script> <h1>Some example source</h1><p>This is a paragraph element</p>");
var text = document.Body.Text();
Run Code Online (Sandbox Code Playgroud)
这将返回以下文本
一些示例源这是一个段落元素
理想情况下,我希望它返回 Some example source 这是一个段落元素 ,其中每个节点文本值之间有一些分隔。
错误报告
System.TypeInitializationException
HResult = 0x80131534
Message = Initializer type "AngleSharp.Configuration" threw an exception.
Source = AngleSharp
Stack trace:
in AngleSharp.Configuration.get_Default ()
in AngleSharp.BrowsingContext.NewFrom [TService] (TService instance)
in AngleSharp.Html.Parser.HtmlParser..ctor ()
in rsh.Parser_test..ctor () in Z: \ vs \ csharp \ prb \ rsh \ rsh \ Parser_test.cs: line 19
in rsh.Form1..ctor () in Z: \ vs \ csharp \ prb \ rsh \ rsh \ Form1.cs: line 18
in rsh.Program.Main () in Z: \ vs \ csharp \ prb \ rsh …
Run Code Online (Sandbox Code Playgroud) anglesharp ×10
c# ×8
html-parsing ×2
javascript ×2
web-scraping ×2
.net ×1
.net-4.7.2 ×1
c#-4.0 ×1
html5 ×1
linq ×1
parsing ×1