【问题标题】:Use HTML Agility Pack to extract dynamic content使用 HTML Agility Pack 提取动态内容
【发布时间】:2017-01-19 20:28:16
【问题描述】:

假设我有一个包含 10 个新闻来源的列表,我希望将它们导入本地数据库。我需要打开这些外部新闻页面中的每一个,提取主要内容并保存。所有这些页面中的 html 结构都不同。有的使用 div,有的使用文章标签。

我知道我可以使用 HttpWebRequest 对象打开页面,并使用 HtmlAgilityPack 加载 [HTML] 文档。

HttpWebRequest oReq = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)oReq.GetResponse();
var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(resp.GetResponseStream());

但是,我不知道如何在不知道类型的情况下定位主要元素。

我正在尝试做的事情可能吗?

【问题讨论】:

  • 您是否查看过新闻网站,看看他们是否提供 API 来获取您想要的数据?对于这样的网站,网页抓取通常不被接受(即不允许)。
  • 一个选项可能是(以编程方式)查看其他页面,找到具有最多文本/或页面之间文本变化最多的元素,并定位该元素。它可能会让你更接近你想要的东西,但并不完美。如果您真的很热衷,您可以编写一个神经网络并使用许多网站对其进行训练,并根据主要内容对其进行验证,但无论如何,第一个选项更容易实现:)
  • 因为像bing.com/newsnews.google.com/news 这样的新闻聚合以前从未做过,这显然是不可能的。此外,设计这样的“不可能”系统对于 SO 问题来说过于宽泛 - 如果您缩小页面上实际想要检测的范围,它可能会成为主题。

标签: c# html-agility-pack


【解决方案1】:

HTML Agility Pack 非常有用,但使用它的代码通常必须根据网站的结构进行定制。

您可以尝试通用和自适应,但即使是像 Evernote 这样的“大男孩”也必须针对不同的网站布局提供不同的剪辑选项。

我首先要看的是:如果是新闻,你应该改用他们的 RSS 源吗? (不仅在技术上,而且在法律上。请查看网站的服务条款部分。)

如果您必须解析他们的站点,我建议为每个实现该接口的站点创建一个接口和一个单独的类。调整每个类以匹配各自站点的结构。

【讨论】:

  • 我喜欢创建一个接口和一个单独的类的想法。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多