我正在尝试为Digikey编写一个屏幕抓取工具,这样我们公司就可以在零件停产时准确跟踪定价,零件供应和产品更换。我在Chrome Devtools中看到的XPATH与Firefox上的Firebug以及我的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。
答案 0 :(得分:0)
尝试使用此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中使用谷歌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时设置了断点,您可以通过父母,然后继续寻找其他节点。我通常会在“监视”窗口中手动输入命令并使用树视图导航以查看属性,属性和子项。
答案 1 :(得分:0)
只是为了更新:
我从c#切换到更友好的Python(我的编程经验是asm,c和python,整个OO都是全新的)并设法纠正我的xpath问题。标签确实是问题,但幸运的是它是独一无二的,所以有点正规表达和删除线,我的状态很好。我不确定为什么这样的标签打破了XPATH。如果有人有一些见解,我想听听。