使用HtmlAgilityPack进行屏幕刮擦时,我可以同时搜索多种标签类型吗?

时间:2014-02-14 20:29:42

标签: c# linq screen-scraping html-agility-pack linq-to-objects

虽然仍处于可塑性状态,但此代码有效:

public List<string> GetParagraphsListFromHtml(string sourceHtml)
{
    var pars = new List<string>();
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(sourceHtml);

    var getHtmlWeb = new HtmlWeb();
    var document = getHtmlWeb.Load("http://www.montereycountyweekly.com/opinion/letters/article_e333a222-942d-11e3-ba9c-001a4bcf6878.html"); 
    var pTags = document.DocumentNode.SelectNodes("//p");
    int counter = 1;
    if (pTags != null)
    {
        foreach (var pTag in pTags)
        {
            pars.Add(pTag.InnerText);
            MessageBox.Show(pTag.InnerText);
            counter++;
        }
    }
    MessageBox.Show("done!");
    return pars;
}

我真正想要的是获取所有文本元素(按顺序),而不仅仅是段落标记(“SelectNodes(”// p“))。

是否可以同时获得多种标签类型,例如(伪代码):

var textTags = document.DocumentNode.SelectNodes("//h1", "//h2", "//h3", "//p", );

...或LINQified版本,例如:

    foreach (var par in doc.DocumentNode
        .DescendantNodes()
        .Single(x => x.Id == "body")
        .DescendantNodes()
        .Where(x => x.Name == "h1" || x.Name == "h2" || x.Name == "h3" || x.Name == "hp" || ))

1 个答案:

答案 0 :(得分:1)

我认为这可能适合你:

doc.DocumentNode.ChildNodes.Where(x => (x.NodeType == HtmlNodeType.Text));

这将获取所有文本元素。