【问题标题】:Retrieve data from a website via Visual Basic通过 Visual Basic 从网站检索数据
【发布时间】:2013-02-13 17:50:07
【问题描述】:

我们可以从这个网站购买小部件,该网站在其自己的网页上提供每个部件的详细信息。示例:http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND。我必须在我们的数据库中找到他们所有的零件,并将制造商和制造商零件编号值添加到他们的字段中。

有人告诉我,Visual Basic 有一种方法可以访问网页并提取信息。如果有人能指出我从哪里开始的正确方向,我相信我能弄清楚。

谢谢。

【问题讨论】:

标签: asp.net vb.net visual-studio-2010


【解决方案1】:

如何使用 HTMLAgilityPack (VB.Net) 抓取网站

我同意htmlagilitypack 是完成此任务的最简单方法。它比仅使用正则表达式更不容易出错。以下将是我如何处理抓取。

下载htmlagilitypack*dll后,新建一个应用,通过nuget添加htmlagilitypack,并引用。如果您可以使用 Chrome,它将允许您检查页面以获取有关您的信息所在位置的信息。右键单击您要捕获的值并查找在其中找到它的表(按照 HTML 向上一点)。

以下示例将从“定价”表中的该页面提取所有值。我们需要知道表的XPath 值(该值用于指示 htmlagilitypack 查找内容),以便我们创建的文档查找我们的特定值。这可以通过找到您的值所在的任何结构并右键单击复制 XPath 来实现。由此我们得到...

//*[@id="pricing"]

请注意,有时您从 Chrome 获得的 XPath 可能会相当大。您通常可以通过查找您的值所在的表的独特之处来简化它。在本例中,它是“id”,但在其他情况下,它很容易是标题或类或其他任何东西。

这个 XPath 值查找 id 等于定价的东西,即我们的表。当我们进一步观察时,我们看到我们的值在 tbody、tr 和 td 标签内。 HtmlAgilitypack 不适用于 tbody 所以忽略它。我们的新 XPath 是...

//*[@id='pricing']/tr/td

此 XPath 表示在页面中查找定价 id,然后在其 tr 和 td 标记中查找文本。现在我们添加代码...

Dim Web As New HtmlAgilityPack.HtmlWeb
Dim Doc As New HtmlAgilityPack.HtmlDocument
Doc = Web.Load("http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND")
For Each table As HtmlAgilityPack.HtmlNode In Doc.DocumentNode.SelectNodes("//*[@id='pricing']/tr/td")

Next

要提取值,我们只需引用在循环中创建的表值及其内部文本成员。

Dim Web As New HtmlAgilityPack.HtmlWeb
Dim Doc As New HtmlAgilityPack.HtmlDocument
Doc = Web.Load("http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND")
For Each table As HtmlAgilityPack.HtmlNode In Doc.DocumentNode.SelectNodes("//*[@id='pricing']/tr/td")
    MsgBox(table.InnerText)
Next

现在我们有了弹出值的消息框...您可以切换消息框以填充数组列表或以任何您希望存储值的方式。现在只需对您希望获得的任何其他表格执行相同的操作。

请注意,创建的 Doc 变量是可重复使用的,因此如果您想循环浏览同一页面中的不同表,则不必重新加载页面。这是一个好主意,特别是如果您提出许多请求,又不想破坏网站,并且如果您要自动执行大量抓取,则请求之间会留出一些时间。

刮痧真的那么容易。这就是基本思想。玩得开心!

【讨论】:

  • 您好,感谢您花这么多时间帮助我。唯一的问题是值之外的所有标签都没有任何 ID,所以我不能真正使用 SelectNodes。
  • 好的,到此为止。至于找到一个没有可识别标识符的值,试试这个。突出显示您在最初问题中列出的页面的价格中断列中的“1”。右键单击并检查元素。您将在下面看到突出显示的 html,右键单击并复制 xpath。把它粘贴到记事本中,它应该看起来像 //*[@id="pricing"]/tbody/tr[2]/td[1] 继续。
  • Assmann WSW Components 我想检索值,但我似乎无法像使用 id 那样使用 itemprop。我也没有看到以 //* 开头的 xpath
  • 你会注意到我们得到的文本有一些数组索引符号。这是其结构中的实际位置...通过更改这些值,您可以获得表格的其他区域。现在删除 tbody,因为它不会返回结果,将其粘贴到您的选择节点中并将 " 更改为 '
  • 获取名称 "//span[@itemprop='name']"
【解决方案2】:

Html Agility Pack 将成为你的朋友!

什么是 Html Agility Pack (HAP)?

这是一个敏捷的 HTML 解析器,它构建了一个读/写 DOM 并支持 普通的 XPATH 或 XSLT(您实际上不必了解 XPATH 或 XSLT 使用它,不用担心...)。它是一个 .NET 代码库,允许 您可以解析“网络之外”的 HTML 文件。解析器非常宽容 使用“真实世界”格式错误的 HTML。对象模型非常相似 什么建议 System.Xml,但用于 HTML 文档(或流)。

查看您提供的示例页面的源代码,他们在标记中使用了 HTML5 微数据。我在CodePlex 上进行了更多搜索,发现了一个可能也有帮助的微数据解析器:MicroData Parser

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多