我正在为奖品信息构建一个小型专业搜索引擎。引擎只会收集每个站点上的特定数据段。我的计划是将流程分为两个步骤。
基于URL的简单屏幕抓取,该URL指向我需要的片段所在的页面。 最简单的方法是使用WebClient对象并获取完整的HTML吗?
拉动HTML并保存后,通过一些脚本对其进行分析,并仅提取我需要的细分和值(例如产品的价格值)。我的问题是,这个脚本必须对我拉的每个站点都是唯一的,它必须能够处理真正丑陋的HTML(所以我不认为XSLT会做...)我需要能够改变它随着目标站点的更新和更改而动态。我将最终获取特定值并将其写入数据库以使其可搜索
请您给我一些关于如何构建最佳方法的提示?你会做上面描述的不同吗?
答案 0 :(得分:3)
好吧,我会按照你描述的方式去。
<强> 1 强> 它要处理多少数据?通过WebClient / HttpWebRequest获取完整的HTML应该不是问题。
<强> 2 强> 我会去HtmlAgilityPack进行HTML解析。这是非常宽容的,可以处理丑陋的标记。由于HtmlAgilityPack支持XPath,因此为各个站点选择特定的xpath非常容易。
我正在奔跑,并尽快扩大这个答案。
答案 1 :(得分:1)
是的,WebClient可以很好地解决这个问题。 WebBrowser控件也可以根据您的要求工作。如果要将文档加载到HtmlDocument(IE HTML DOM)中,则可能更容易使用Web浏览器控件。
现在内置于.NET中的HtmlDocument对象可用于解析HTML。它被设计为与WebBrowser控件一起使用,但您也可以使用mshtml dll中的实现。我曾经使用过HtmlAgilityPack,但我听说它可以做类似的工作。
HTML DOM对象通常会处理并修复你向它们抛出的最丑陋的HTML。除了允许更好的方式来解析html,document.GetElementsByTag以获取标签对象的集合,例如。
至于处理网站不断变化的要求,它听起来像strategy pattern的好候选人。您可以使用反射或类似的东西为每个站点加载策略。
我参与过一个使用XML来定义一组通用参数的系统,这些参数用于从HTML页面中提取文本。基本上它会定义开始和结束提取的开始和结束元素。我发现这种技术对于小样本来说效果很好,但随着站点集合变得越来越大,它变得相当麻烦且难以定制。使XML保持最新并尝试保留一组通用的XML并将代码处理为任何类型的站点都很困难。但是如果站点的类型和数量很小,那么这可能会有效。
最后要提到的是,您可能希望为您的方法添加清洁步骤。在进入流程时清理HTML的灵活方法对我过去编写的代码非常宝贵。如果您认为域名足够复杂以保证它,那么实现一种pipeline类型可能是一种很好的方法。但是,即使只是一种在解析它之前对HTML运行一些正则表达式的方法也很有价值。摆脱图像,用更好的HTML等替换特定的误用标签。那里真正狡猾的HTML的数量继续令我惊讶......