【问题标题】:how to extract a url's title, images and description using HTML Agility utility如何使用 HTML Agility 实用程序提取 url 的标题、图像和描述
【发布时间】:2012-10-31 12:35:22
【问题描述】:

我想使用HTML Agility utility 从 URL 中提取标题、描述和图像,但目前我无法找到一个易于理解的示例并且可以帮助我做到这一点。

如果有人可以帮助我提供示例,我将不胜感激,以便我可以提取标题、描述并让用户选择从一系列图像中选择图像(当我们共享链接时类似于 Facebook)。

更新:

我在 .aspx 页面上放置了标题、描述和按钮、文本框的标签,并且我在按钮单击事件上触发了以下代码。但它为所有值返回 null 。可能是我做错了什么。

我使用了以下示例网址http://edition.cnn.com/2012/10/31/world/asia/india/index.html?hpt=hp_t2

protected void btnGetURLDetails_Click(object sender, EventArgs e)
{
    HtmlDocument doc = new HtmlDocument();
    var response = txtURL.Text;
    doc.LoadHtml(response);

    String title = (from x in doc.DocumentNode.Descendants()
                    where x.Name.ToLower() == "title"
                    select x.InnerText).FirstOrDefault();

    String desc = (from x in doc.DocumentNode.Descendants()
                   where x.Name.ToLower() == "description"
                   select x.InnerText).FirstOrDefault();

    List<String> imgs = (from x in doc.DocumentNode.Descendants()
                         where x.Name.ToLower() == "img"
                         select x.Attributes["src"].Value).ToList<String>();

    lblTitle.Text = title;
    lblDescription.Text = desc;
}

上面的代码让我得到所有变量的空值

如果我用这个修改代码

HtmlDocument doc = new HtmlDocument();
        var url = txtURL.Text;

        var webGet = new HtmlWeb();
         doc = webGet.Load(url);

在这种情况下,它只会让我的标题和描述的值再次为空

【问题讨论】:

  • 我必须设计一个页面,管理员将在其中添加 URL,然后代码应在页面 (URL) 上显示标题、描述和图像。我不能给你 HTML,因为它基于 URL,你可以使用任何 URL,例如任何网站上的新闻或文章也有图片

标签: c# asp.net webforms html-agility-pack


【解决方案1】:
protected void btnGetURLDetails_Click(object sender, EventArgs e)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(txtURL.Text));
    request.Method = WebRequestMethods.Http.Get;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    StreamReader reader = new StreamReader(response.GetResponseStream());

    String responseString = reader.ReadToEnd();

    response.Close();

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(responseString);

    String title = (from x in doc.DocumentNode.Descendants()
                where x.Name.ToLower() == "title"
                select x.InnerText).FirstOrDefault();

    String desc = (from x in doc.DocumentNode.Descendants()
               where x.Name.ToLower() == "meta"
               && x.Attributes["name"] != null
               && x.Attributes["name"].Value.ToLower() == "description"
               select x.Attributes["content"].Value).FirstOrDefault();

    List<String> imgs = (from x in doc.DocumentNode.Descendants()
                     where x.Name.ToLower() == "img"
                     select x.Attributes["src"].Value).ToList<String>();

   lblTitle.Text = title;
   lblDescription.Text = desc;

}

【讨论】:

  • 嗨,Danilo,谢谢,我已经用你的解决方案更新了我的问题,但我无法让它作为标题的值工作,desc ..对于任何 URL 都是空的。
  • 您需要发出 HttpWebRequest 以获得所需 URL 的响应。我改变了答案
  • @Danila,我能够让它工作,但问题是它确实为 desc 返回 null 我用你的新代码相同的结果尝试了事件。
  • 我使用以下代码来获取描述,但问题是它区分大小写。 Description 不同于 description ` HtmlNode node = doc.DocumentNode.SelectSingleNode("//meta[@name='description']"); // 描述大小写敏感 var desc2 = ""; if (node != null) { desc2 = node.GetAttributeValue("content", ""); // TODO: 在某处写 desc }`
  • 您确定响应包含描述标签吗?从代码中可以看出,有 ToLower() 方法调用,这就是为什么描述是小写的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多