C# 如何获取多个<;a>;标签?

C# 如何获取多个<;a>;标签?,c#,html-agility-pack,C#,Html Agility Pack,这是我的示例页面。我想把标签的所有内部文本都放到一个字符串中。我为此编写了代码,但它不能正常工作 我希望将所有标记的内部文本都转换为一个字符串,我使用了这段代码,但它不能正常工作 class Values { private HtmlAgilityPack.HtmlDocument _markup; HtmlWeb web = new HtmlWeb(); //creating object of HtmlWeb form1 frm = new form1;

这是我的示例页面。我想把标签的所有内部文本都放到一个字符串中。我为此编写了代码,但它不能正常工作


我希望将所有标记的内部文本都转换为一个字符串,我使用了这段代码,但它不能正常工作

class Values
{
    private HtmlAgilityPack.HtmlDocument _markup;

    HtmlWeb web = new HtmlWeb(); //creating object of HtmlWeb
    form1 frm = new form1;

    _markup = web.Load("mypage.html"); // load page

    public string Genres
    {
        get
        {
            HtmlNodeCollection headers = _markup.DocumentNode.SelectNodes("//div[contains(@id, 'infor')]/a"); // I filter all of <a> tags in <div id="infor">
            if (headers != null)
            {
                string genres = "";
                foreach (HtmlNode header in headers) // I'm not sure what happens here. 
                {
                    HtmlNode genre = header.ParentNode.SelectSingleNode(".//a[contains(@href, '#')]"); //I think an error occurred in here... 
                    if (genre != null)
                    {
                        genres += genre.InnerText + ", ";
                    }
                }
                return genres;
            }
            return String.Empty;
        }
    }

    frm.text1.text=Genres;
}
但我想要这样的输出:

Animation, Short, Action,

您的问题似乎是
header.ParentNode.SelectSingleNode(“.//a[contains(@href,#“)]”)语句中的
语句。它将带您返回到父
div
元素,然后找到第一个
a
元素,该元素与条件匹配(始终是相同的)。您已经有了
a
节点,因此您可以通过其属性检查它的属性,而不是进行另一次选择。然而,当您可以只进行一次选择而在第一时间缩小范围时,进行第二次选择是愚蠢的,例如:

HtmlNodeCollection headers = _markup.DocumentNode.SelectNodes("//div[contains(@id, 'infor')]/a[contains(@href, '#')]");
if (headers != null)
    {
    string genres = "";
    foreach (HtmlNode header in headers) // i not sure what happens here. 
        {
        genres += header.InnerText + ", ";
        }
    return genres;
    }

我认为,一点Linq和使用后代会让你更容易到达那里

var genreNode = _markup.DocumentNode.Descendants("div").Where(n => n.Id.Equals("genre")).FirstOrDefault();
if (genreNode != null)
{
    // this pulls all <a> nodes under the genre div and pops their inner text into an array
    // then joins that array using the ", " as separator.
    return string.Join(", ", genreNode.Descendants("a")
        .Where(n => n.GetAttributeValue("href", string.Empty).Equals("#"))
        .Select(n => n.InnerText).ToArray());
}
var genreNode=_markup.DocumentNode.substands(“div”)。其中(n=>n.Id.Equals(“流派”).FirstOrDefault();
if(genreNode!=null)
{
//这会将所有节点拉到genre div下,并将其内部文本弹出到一个数组中
//然后使用“,”作为分隔符加入该数组。
返回string.Join(“,”,genreNode.subjections(“a”)
.Where(n=>n.GetAttributeValue(“href”,string.Empty)。等于(“#”)
.Select(n=>n.InnerText.ToArray());
}

是否
标题
不是您实际想要获取
内部文本
的节点?体裁选择代码看起来就像是说得到第一个兄弟姐妹,这显然是相同的每一次。。。你想用这段代码做什么?
var genreNode = _markup.DocumentNode.Descendants("div").Where(n => n.Id.Equals("genre")).FirstOrDefault();
if (genreNode != null)
{
    // this pulls all <a> nodes under the genre div and pops their inner text into an array
    // then joins that array using the ", " as separator.
    return string.Join(", ", genreNode.Descendants("a")
        .Where(n => n.GetAttributeValue("href", string.Empty).Equals("#"))
        .Select(n => n.InnerText).ToArray());
}