试图解析下面html代码中的所有文本(主要是url)。但我只想获取这些div标记(结果-第一线-标题)和(结果- url js-结果-url)之间的url。
为了明确起见,我可以从下面的html源抓取所有的url,但问题是它也抓取了url几乎3次。为此,我有一个用于删除重复url的修复程序,但是,如果仔细查看html源代码,您将看到它也获取了第三个url。
<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> 我尝试了下面的c#代码来获取div标记之间的文本,但是它抓住了所有我不想要的东西。
int urlTagFrom = rawHTMLFromSource.IndexOf("result-firstline-title") + "result-firstline-title".Length;
int urlTagTo = rawHTMLFromSource.LastIndexOf("result-url js-result-url");
urlTagCollection = rawHTMLFromSource.Substring(urlTagFrom, urlTagTo - urlTagFrom);为了获取url,我使用以下方法:
var regexURLParser = new Regex(@"(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?", RegexOptions.Singleline | RegexOptions.CultureInvariant);
我想要的是这些网址:
<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"
>因此,结果只显示:
https://www.lifewire.com/top-social-networking-sites-people-are-using-3486554
http://www.ebizmba.com/articles/social-networking-websites 发布于 2019-04-24 09:55:04
您可以通过使用HTMLAgilityPack使其更容易,只需使用NuGet将其包含在项目中即可。
使用HTMLAgilityPack添加NuGet
转到Package Manager Console并键入Install-Package HtmlAgilityPack -Version 1.11.3
安装之后,您可以提取如下所示的Urls。
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));编辑
将&& x.HasClass("result-title") && x.HasClass("js-result-title")添加到只显示具有类结果标题和js结果标题的元素。
另一种方式
更短的和另一种获得过滤值的方法。
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();https://stackoverflow.com/questions/55823138
复制相似问题