c#子字符串-解析中间的所有文本
尝试解析下面html代码中的所有文本(主要是url)。但我只想获取这些div标记(result firstline title)和(result url js result url)之间的url,用于每个(所有)事件 要明确的是,我能够从下面的html源抓取所有的url,但问题是它也抓取了url几乎3次。为此,我有一个修复程序,可以删除重复的url,但是,如果仔细查看html源代码,您会发现它也会捕获第三个urlc#子字符串-解析中间的所有文本,c#,substring,C#,Substring,尝试解析下面html代码中的所有文本(主要是url)。但我只想获取这些div标记(result firstline title)和(result url js result url)之间的url,用于每个(所有)事件 要明确的是,我能够从下面的html源抓取所有的url,但问题是它也抓取了url几乎3次。为此,我有一个修复程序,可以删除重复的url,但是,如果仔细查看html源代码,您会发现它也会捕获第三个url <div class="result js-result card-mobi
<div class="result js-result card-mobile ">
<div class="result-firstline-container">
<div class="result-firstline-title">
<a
class="result-title js-result-title"
href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554"
>
The Top Social Networking Sites People Are Using
</a>
</div>
</div>
<a
class="result-url js-result-url"
href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554">https://www.lifewire.com/top-<b>social-networking-sites</b>-people-are...
</a>
<p class="result-snippet">
The Top
</p>
</div>
<div class="result js-result card-mobile ">
<div class="result-firstline-container">
<div class="result-firstline-title">
<a
class="result-title js-result-title"
href="http://www.ebizmba.com/articles/social-networking- websites"
>
Top 15 Most Popular Social Networking Sites | January 2019
</a>
</div>
</div>
<a
class="result-url js-result-url"
href="http://www.ebizmba.com/articles/social-networking- websites">www.ebizmba.com/articles/<b>social-networking</b>-<b>websites</b>
</a>
<p class="result-snippet">
Top 15 Most
</p>
</div>
要获取url,我使用以下方法:
var regexURLParser=new Regex(@“(http ^ ftp ^ https):\/\/([\w\-\+(?:(?:\.[\w\-\+)+))([\w\-,@^=%&;:/\+\\\\\\\%*[\w\-\\\\^=%&;/\++\+\\\\\\+++)”,RegexOptions.single RegexOptions.single RegexOptions.CultureInvariant)代码>
我想从以下内容中获取url:
<a
class="result-title js-result-title"
href="https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554"
>
<a
class="result-title js-result-title"
href="http://www.ebizmba.com/articles/social-networking-websites"
>
通过使用NuGet将其包含在项目中,您可以使它变得更容易
使用NuGet添加HTMLAgilityPack
转到软件包管理器控制台
并键入安装软件包HtmlAgilityPack-版本1.11.3
安装后,您可以提取URL,如下所示
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"put html string here");
var listOfUrls = new List<string>();
doc.DocumentNode.SelectNodes("//a").ToList()
.ForEach(x=>
{
//Use HasClass method to filter elements
if (!string.IsNullOrEmpty(x.GetAttributeValue("href", ""))
&& x.HasClass("result-title") && x.HasClass("js-result-title"))
{
listOfUrls.Add(x.GetAttributeValue("href", ""));
}
});
listOfUrls.ForEach(x => Console.WriteLine(x));
为了人类的利益,。让你的生活简单很多,并使用AngleSharp。@NPras为什么要使用XML?我遗漏了什么吗?@sLw HTML是多种XML,因此XML解析器可能会简化这个问题的解决方案。如果我们学究的话,从技术上讲HTML不是严格的XML()。但该示例似乎是一个格式正确的XML片段,因此一个简单的XML解析器很可能可以工作。HTML解析器可能更重,您需要依赖第三方代码。好的,这个方法也会获取第二个url,因为它位于href属性中。我只需要这个(class=“result title js result title”)标记后面的url。@Buddhihin要用class过滤元素,可以使用HasClass
方法。请看编辑。谢谢,我试过你的第二种方法,它很有效。这样做比正则表达式快吗?还有,还有其他方法可以实现吗?是的,还有其他方法可以实现同样的效果,Regex可以更快,但不适合这样做。如果你觉得这很有帮助,那么就接受这个答案,这样其他人就可以从中受益。
https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554
http://www.ebizmba.com/articles/social-networking-websites
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"put html string here");
var listOfUrls = new List<string>();
doc.DocumentNode.SelectNodes("//a").ToList()
.ForEach(x=>
{
//Use HasClass method to filter elements
if (!string.IsNullOrEmpty(x.GetAttributeValue("href", ""))
&& x.HasClass("result-title") && x.HasClass("js-result-title"))
{
listOfUrls.Add(x.GetAttributeValue("href", ""));
}
});
listOfUrls.ForEach(x => Console.WriteLine(x));
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"put html string here");
var listOfUrls = doc.DocumentNode.Descendants("a")
.Where(x => x.Attributes["class"] != null
&& x.Attributes["class"].Value == "result-title js-result-title")
.Select(x => x.GetAttributeValue("href", "")).ToList();