尝试从下面的html代码解析所有文本(主要是url)。但是我只想为每个(所有)事件获取这些div标签(result-firstline-title)和(result-url js-result-url)之间的网址。
要清楚,我能够从下面的html源中获取所有url,但问题是它也几乎获取了3次url。并且为此,我有一个删除重复网址的修复程序,但是,如果您仔细查看html源代码,您会发现它也捕获了第三个网址。
<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);
要获取网址,我正在使用以下内容:
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
非常感谢。如果有什么听起来令人困惑的地方,请告诉我,以便我尝试其他方法进行解释。
答案 0 :(得分:2)
您可以通过使用HTMLAgilityPack使其更容易,只需使用NuGet将其包括在项目中即可。
要使用NuGet添加HTMLAgilityPack
转到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")
,以仅显示具有result-title和js-result-title类的元素。
另一种方式
更简短,也是获取过滤值的另一种方法。
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();