使用HtmlAgilityPack获取href链接的文本内容

3

我正在尝试创建一个新闻代理程序,以获取网站上的新闻。因此,我必须使用类似于 HtmlAgilityPackhtml解析器。以下是我的代码:

public async void parsing(string website)
{
    HttpClient http = new HttpClient();
    var response = await http.GetByteArrayAsync(website);
    String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
    source = WebUtility.HtmlDecode(source);
    HtmlDocument resultat = new HtmlDocument();
    resultat.LoadHtml(source);
    List<HtmlNode> toftitle = resultat.DocumentNode.Descendants().Where
      (x => (x.Name == "div" && x.Attributes["class"] != null && x.Attributes["class"].Value.Contains("latest-news"))).ToList();
    var li = toftitle[0].Descendants("li").ToList();
    foreach (var item in li)
    {
        var link = item.Descendants("a").ToList()[0].GetAttributeValue("href", null);
        var img = item.Descendants("img").ToList()[0].GetAttributeValue("src", null);
    }
}

以下是需要解析的我的html代码:

<a href="/news?p_p_id=56_INSTANCE_tVzMoLp4zfGh&amp;_56_INSTANCE_tVzMoLp4zfGh_mode=news&amp;_56_INSTANCE_tVzMoLp4zfGh_newsId=3153832&amp;p_p_state=maximized">› پانل «بررسي سازوکارهاي تأمين منابع مالي براي توسعۀ فناوري» به‌عنوان پانل برتر پنجمين کنفرانس بين‌المللي و نهمين کنفرانس ملي مديريت فناوري معرفي شد</a>


<a href="/news?p_p_id=56_INSTANCE_tVzMoLp4zfGh&amp;_56_INSTANCE_tVzMoLp4zfGh_mode=news&amp;_56_INSTANCE_tVzMoLp4zfGh_newsId=3135970&amp;p_p_state=maximized">› فرآیند و فرم درخواست استفاده از تسهیلات حمایتی بلاعوض صندوق نوآوری و شکوفایی جهت حضور شرکت های دانش بنیان در جایزه ملی مدیریت فناوری و نوآوری</a>

所以问题是我可以获取`href link`但无法获取`href value`。我的意思是我可以获取新闻链接,但无法获取标题`پانل«بررسي سازوکارهاي تأمين منابع مالي براي توسعۀ فناوري» به‌عنوان پانل برتر پنجمين کنفرانس بين‌المللي و نهمين کنفرانس ملي مديريت فناوري معرفي شد`。 我该怎么办?

1
href只有一个值,即链接。您想要的“标题”是a元素的innertext。 - Sami Kuhmonen
@SamiKuhmonen 那我怎么才能获取到那个innertext呢? - Ehsan Akbar
@SamiKuhmonen 我编辑了这篇帖子,只是添加了一个li元素。 - Ehsan Akbar
3个回答

4
你可以像这样使用:
 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
 doc.LoadHtml(result);
 foreach (HtmlNode link in doc.DocumentNode.SelectNodes("a"))
        {
            string value = link.InnerText; // here you can get href value 
        }

3

我只需要使用这段代码来获取 href 的 innertext:

string tistle = item.Descendants("a").ToList()[0].InnerText;

1
您的代码可以进行一些清理,变成这样:
List<HtmlNode> toftitle = resultat.DocumentNode
                                  .Descendants("div")
                                  .Where(x => GetAttributeValue("class","").Contains("latest-news"))
                                  .First();
foreach (HtmlNode item in toftitle.Descendants("li"))
{
    var link = item.Descendants("a").First();
    var url = link.GetAttributeValue("href", null); //get the link url
    var text = link.InnerText.Trim(); //get the link text

    var img = item.Descendants("img").First().GetAttributeValue("src", null);
}

基本上,你应该使用 First()FirstOrDefault() 来获取 IEnumerable<T> 的第一个项目,而不是使用 ToList()[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接