使用HTML Agility Pack和Linq解析内容

时间:2015-03-13 14:54:35

标签: c# linq html-parsing html-agility-pack

我正在尝试为html中的搜索关键字获取重要内容。

使用以下代码生成HtmlNodeCollection

var findclasses = doc.DocumentNode.SelectNodes("//body//*[not(self::script)]").Where(x => x.InnerHtml.Contains("SearchedKeywordText") && x.InnerHtml.Contains("SearchedKeyword1Text")).OrderBy(x => x.Name);
                string FirstContent = findclasses.First().InnerText;

我得到了这个结果

  
      
  • 结果视图展开结果视图将枚举IEnumerable
  •   
  • [0]姓名:" div"} HtmlAgilityPack.HtmlNode
  •   
  • [1]姓名:" div"} HtmlAgilityPack.HtmlNode
  •   
  • [2]姓名:" div"} HtmlAgilityPack.HtmlNode
  •   
  • [3]姓名:" ul"} HtmlAgilityPack.HtmlNode
  •   
  • [4]姓名:" li"} HtmlAgilityPack.HtmlNode
  •   
  • [5]姓名:" span"} HtmlAgilityPack.HtmlNode
  •   
  • [6]姓名:" span"} HtmlAgilityPack.HtmlNode
  •   
  • [7]姓名:" div"} HtmlAgilityPack.HtmlNode
  •   
  • [8]姓名:" span"} HtmlAgilityPack.HtmlNode
  •   
  • [9]姓名:" span"} HtmlAgilityPack.HtmlNode
  •   
  • [10]姓名:" ul"} HtmlAgilityPack.HtmlNode
  •   
  • [11]姓名:" li"} HtmlAgilityPack.HtmlNode
  •   

但是当我想简单地修改代码以从外部获取字符串时:

string search1 = "SearchedKeywordText";
string search2 = "SearchedKeyword1Text";
..
..
var findclasses = doc.DocumentNode.SelectNodes("//body//*[not(self::script)]").Where(x => x.InnerHtml.Contains(search1) && x.InnerHtml.Contains(search2)).OrderBy(x => x.Name);
                    string FirstContent = findclasses.First().InnerText;

结果:

  
      
  • 结果视图展开结果视图将枚举IEnumerable
          空"枚举没有产生结果"
  •   

第一个块中的枚举对我有用,但在此之后更改它不起作用。这个简单的问题有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您在空.First()

上呼叫IEnumerable

您可以使用.Any()检查findclasses是否为空

if (findclasses.Any())
{
   string firstContent = findclasses.First().InnerText;
}
  • 为什么它是空的?

也许有结果,但有一个案例错配,你需要让你的搜索案例不敏感,为此而不是

x.InnerHtml.Contains(search1) 

你可以这样做:

x.InnerHtml.IndexOf(search1,StringComparison.InvariantCultureIgnoreCase)>=0
如果找到搜索关键字,无论字母大小写如何,

将返回true。