c# - HTML Agility Pack 屏幕抓取 XPATH 未返回数据

标签 c# screen-scraping html-agility-pack web-scraping

我正在尝试为 Digikey 编写一个屏幕抓取程序,使我们的公司能够准确跟踪价格、部件可用性和部件停产时的产品更换。我在 Chrome Devtools 和 Firefox 上的 Firebug 中看到的 XPATH 与我的 C# 程序看到的似乎存在差异。

我目前正在抓取的页面是 http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=296-12602-1-ND

我目前使用的代码非常快速和肮脏...

   //This function retrieves data from the digikey
   private static List<string> ExtractProductInfo(HtmlDocument doc)
   {
       List<HtmlNode> m_unparsedProductInfoNodes = new List<HtmlNode>();
       List<string> m_unparsedProductInfo = new List<string>();

       //Base Node for part info
       string m_baseNode = @"//html[1]/body[1]/div[2]";

       //Write part info to list
       m_unparsedProductInfoNodes.Add(doc.DocumentNode.SelectSingleNode(m_baseNode + @"/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]"));
       //More lines of similar form will go here for more info
       //this retrieves digikey PN

       foreach(HtmlNode node in m_unparsedProductInfoNodes)
       {
           m_unparsedProductInfo.Add(node.InnerText);
       }

       return m_unparsedProductInfo;
   }

虽然我使用的路径看起来是“正确的”,但当我查看列表“m_unparsedProductInfoNodes”时,我总是得到 NULL

知道这里发生了什么吗?我还要补充一点,如果我在 baseNode 上执行“SelectNodes”,它只会返回一个 div,其中唯一重要的子节点是“cs=####”,这似乎因浏览器用户代理而异。如果我尝试以任何方式使用它(将/cs=0 放在无法识别的浏览器的路径中),它会坚持认为我的表达式不会评估为节点集,但保留它们仍然会留下所有数据过去的问题div[2] 返回为 NULL。

最佳答案

尝试使用这个 XPath 表达式:

/html[1]/body[1]/div[2]/cs=0[1]/rf=141[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]

在 Firefox 中使用 Google Chrome 开发者工具和 Firebug,网页似乎在第一个表格之前有一个“cs”和“rf”标签。像这样的东西:

<cs="0">
  <rf="141">
    <table>
    ...
    </table>
  </rf>
</cs>

当您想要解析一个已知 HTML 文件并且您没有得到预期的结果时,了解发生了什么可能很有用。在这种情况下,我只是做了:

string xpath = "";

//In this case I'll get all cells and see what cell has the text "296-12602-1-ND"

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    if (node.InnerText.Trim() == "296-12602-1-ND")
        xpath = node.XPath; //Here it is
}

或者您可以在文档加载后调试您的应用程序,遍历每个子节点,直到找到您想要从中获取信息的节点。如果只是在找到 InnerText 的时候设置断点,那么直接遍历父节点,然后继续寻找其他节点即可。我通常会在“监视”窗口中手动输入命令,然后使用 TreeView 进行导航以查看属性、属性和子项。

关于c# - HTML Agility Pack 屏幕抓取 XPATH 未返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500016/

相关文章:

c# - 找不到方法 - AWS .NET Core 3.1 Mock Lambda 测试工具

c# - IServiceCollection 不包含 AddMvc() 的定义

html - 使用 CSS 进行布局和格式化的屏幕抓取页面...如何抓取适用于 html 的 CSS?

C# html 敏捷包,捕获重定向

c# - 将字符串列表从客户端传递到 Web API

c# - 如何在 Visual Studio 单元测试中使用包含私有(private)类型的泛型

c# - 在线程中执行 Webbrowser 控件的屏幕显示

database - 刮一个phpbb论坛

html-agility-pack - html 敏捷包和文本中的三角括号

javascript - 如何使用 HTML AGILITY PACK 调用 Click