Я пытаюсь разобрать веб-сайт. Мне нужны ссылки в HTML-файле, который содержит некоторые конкретные слова. Я знаю, как найти атрибуты «href», но мне не нужны все они, так или иначе? Например, можно ли использовать регулярное выражение в HtmlAgilityPack?
HtmlNode links = document.DocumentNode.SelectSingleNode("//*[@id='navigation']/div/ul");
foreach (HtmlNode urls in document.DocumentNode.SelectNodes("//a[@]"))
{
this.dgvurl.Rows.Add(urls.Attributes["href"].Value);
}
Я пытаюсь найти все ссылки в HTML-коде.
Если у вас есть HTML-файл, например:
<div class="a">
<a href="http://www.website.com/"></a>
<a href="http://www.website.com/notfound"></a>
<a href="http://www.website.com/theword"></a>
<a href="http://www.website.com/sub/theword"></a>
<a href="http://www.website.com/theword.html"></a>
<a href="http://www.website.com/other"></a>
</div>
И вы ищете, например, следующие слова: theword
и other
. Вы можете определить регулярное выражение, а затем использовать LINQ, чтобы получить ссылки с атрибутом href
соответствующим вашему регулярному выражению, следующим образом:
Regex regex = new Regex("(theworld|other)", RegexOptions.IgnoreCase);
HtmlNode node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='a']");
List<HtmlNode> nodeList = node.SelectNodes(".//a").Where(a => regex.IsMatch(a.Attributes["href"].Value)).ToList<HtmlNode>();
List<string> urls = new List<string>();
foreach (HtmlNode n in nodeList)
{
urls.Add(n.Attributes["href"].Value);
}
Обратите внимание, что есть ключевое слово contains
с XPATH, но вам придется дублировать условие для каждого слова, которое вы ищете, например:
node.SelectNodes(".//a[contains(@href,'theword') or contains(@href,'other')]")
Там также matches
ключевое слово для XPATH, к сожалению , он доступен только с XPATH 2.0 и HtmlAgilityPack использует XPATH 1.0. С XPATH 2.0 вы можете сделать что-то вроде этого:
node.SelectNodes(".//a[matches(@href,'(theword|other)')]")
Я нахожу это, и это работает для меня.
HtmlNode links = document.DocumentNode.SelectSingleNode("//*[@id='navigation']/div/ul");
foreach (HtmlNode urls in document.DocumentNode.SelectNodes("//a[@]"))
{
var temp = catagory.Attributes["href"].Value;
if (temp.Contains("some_word"))
{
dgv.Rows.Add(temp);
}
}