我正在尝试使用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]");
}
}
有没有其他方法可以获得linkNode的image childnode的alt属性(如果存在)?
答案 0 :(得分:40)
使用xpath查询,您还可以使用“。”表示搜索应该从当前节点开始。
HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
答案 1 :(得分:37)
您应该从“/ img [@alt]”中删除forwardslash前缀,因为它表示您要从文档的根目录开始。
HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
答案 2 :(得分: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]");**
}
}
}