正则表达式到 HtmlAgilityPack C#
Regex to HtmlAgilityPack C#
我想知道如何转换我使用正则表达式的代码以匹配其他使用 HtmlAgilityPack 库的网站字符串。
示例代码:
<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>
我当前的代码如下:
List<string> Cap = new List<string>();
WebClient web = new WebClient();
string url = web.DownloadString("127.0.0.1");
MatchCollection cap = Regex.Matches(url, "title=\"(.+?)\">", RegexOptions.Singleline);
foreach (Match m in cap)
{
Cap.Add(m.Groups[1].Value.ToString());
}
lst_Cap.ItemsSource = Cap;
而且有效。
我试过 HtmlAgilityPack:
HtmlDocument Web = web.Load("127.0.0.1"); // 127.0.0.1 for example
List<string> Cap = new List<string>();
foreach (HtmlNode node in Web.DocumentNode.SelectNodes("//*[@id=\"content\"]/div/div[3]/div[2]/div[1]/a"))
{
Cap.Add(node.InnerHtml);
}
但它只增加了 A.1。
我该怎么办?
您的正则表达式 "title=\"(.+?)\">"
匹配并捕获 HTML 文档内任何标签中的任何 title 属性。
因此,使用另一个带有 //*[@title]
XPath 的代码获取包含 title 属性的任何元素节点 (*
),然后遍历属性节点,一旦其名称为 title
,将值添加到列表中:
var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
foreach (var node in nodes)
{
foreach (var attribute in node.Attributes)
if (attribute.Name == "title")
Cap.Add(attribute.Value);
}
}
或使用 LINQ:
var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
var res = nodes.Where(p => p.HasAttributes)
.Select(m => m.GetAttributeValue("title", string.Empty))
.Where(l => !string.IsNullOrEmpty(l))
.ToList();
我想知道如何转换我使用正则表达式的代码以匹配其他使用 HtmlAgilityPack 库的网站字符串。
示例代码:
<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>
我当前的代码如下:
List<string> Cap = new List<string>();
WebClient web = new WebClient();
string url = web.DownloadString("127.0.0.1");
MatchCollection cap = Regex.Matches(url, "title=\"(.+?)\">", RegexOptions.Singleline);
foreach (Match m in cap)
{
Cap.Add(m.Groups[1].Value.ToString());
}
lst_Cap.ItemsSource = Cap;
而且有效。
我试过 HtmlAgilityPack:
HtmlDocument Web = web.Load("127.0.0.1"); // 127.0.0.1 for example
List<string> Cap = new List<string>();
foreach (HtmlNode node in Web.DocumentNode.SelectNodes("//*[@id=\"content\"]/div/div[3]/div[2]/div[1]/a"))
{
Cap.Add(node.InnerHtml);
}
但它只增加了 A.1。
我该怎么办?
您的正则表达式 "title=\"(.+?)\">"
匹配并捕获 HTML 文档内任何标签中的任何 title 属性。
因此,使用另一个带有 //*[@title]
XPath 的代码获取包含 title 属性的任何元素节点 (*
),然后遍历属性节点,一旦其名称为 title
,将值添加到列表中:
var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
foreach (var node in nodes)
{
foreach (var attribute in node.Attributes)
if (attribute.Name == "title")
Cap.Add(attribute.Value);
}
}
或使用 LINQ:
var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
var res = nodes.Where(p => p.HasAttributes)
.Select(m => m.GetAttributeValue("title", string.Empty))
.Where(l => !string.IsNullOrEmpty(l))
.ToList();