HtmlAgilityPack,PCL,没有XPath:如何按类获取所有元素?

时间:2016-10-25 09:40:16

标签: c# xamarin xamarin.forms html-agility-pack

我正在研究的原型需要在网站中提取深层嵌套的IFrame。我需要找到包含类的所有元素,但是在HtmlAgilityPack的PCL发行版中没有XPath,因此this answer不起作用。使用.Descendants()作为this answer的另一种方法似乎也不起作用,因为我尝试过,后代()似乎没有考虑孩子的孩子,或者是否,我不知道怎么做。

site's数据结构如下:

html
  body
    div class mh-container
      div class mh-wrapper
        div class mh-main
          div id main-content
           article class post  
             div class entry-content <- has multiple (2) divs with os_poll
               div class os_poll
                 div class os_widget_container <- TARGET
                   iframe name os_frame <- need data of the 'src' attribute

我的目标是使用os_poll类获取所有元素,然后访问iframe并获取其src数据。由于XPath不起作用,我不知道如何导航节点以获得孩子的孩子(我刚接触HAP),我不知道如何处理这个问题。

1 个答案:

答案 0 :(得分:0)

我找到了一种在PCL项目中按类查找元素的方法。但是你必须使用AngleSharp,而不是HtmlAgilityPack,因为XPath is not available in PCL。检查AngleSharp链接以获取更多信息。

在AngleSharp中按类选择所有元素:

string html;
using (var client = new HttpClient())
{
    string = await client.GetStringAsync("http://your.content.com/some.html");
}
var parser = new HtmlParser();
var doc = parser.Parse(html);
var divs = doc.All.Where(e = > e.LocalName == "div" && e.ClassList.Contains("your-class"));

注意:不要使用我上面链接的网站上的数据,因为上面的网站需要添加os_poll元素的JavaScript,它将无法正常工作。这完全是另一个问题,超出了这个问题的范围。