She*_*eff 38 .net c# asp.net xpath html-agility-pack
我试图使用HtmlAgilityPack库来解析页面中的一些链接,但我没有看到我期望从这些方法得到的结果.在下面我有一个HtmlNodeCollection的链接.对于每个链接,我想检查是否有图像节点,然后解析其属性,但linkNode的SelectNodes和SelectSingleNode方法似乎在搜索父文档而不是linkNode的childNodes给出了什么?
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");
}
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以获得linkNode的image childnode的alt属性(如果存在)?
ult*_*ife 40
使用xpath查询,您还可以使用"." 表示搜索应该从当前节点开始.
HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
Run Code Online (Sandbox Code Playgroud)
Ric*_*lay 38
您应该从"/ img [@alt]"中删除forwardslash前缀,因为它表示您要从文档的根目录开始.
HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
Run Code Online (Sandbox Code Playgroud)
msq*_*sqr 10
另外,请注意Null Check.SelectNodes返回null而不是空白集合.
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
**if(linkNodes!=null)**
{
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
**HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");**
}
}
}
Run Code Online (Sandbox Code Playgroud)