麻烦刮痧.HTM文件

时间:2010-10-21 03:26:10

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

我刚开始从网页上删除基本文本,目前正在使用HTMLAgilityPack C#库。我在rivals.yahoo.com上获得了一些成功的积分榜(运动是我的事情,所以为什么不刮一些有趣的东西?)但我被困在NHL的游戏摘要页面上。我认为这是一个有趣的问题所以我会在这里发布。

我正在测试的页面是: http://www.nhl.com/scores/htmlreports/20102011/GS020079.HTM

乍一看,它似乎是基本文本,没有ajax或东西搞乱一个基本的刮刀。然后我意识到由于一些JavaScript,我无法右键单击,所以我解决了这个问题。我右键单击firefox并使用XPather获取主队的xpath,然后我得到:

/html/body/table[@id='MainTable']/tbody/tr[1]/td/table[@id='StdHeader']/tbody/tr/td/table/tbody/tr/td[3]/table[@id='Home']/tbody/tr[3]/td

当我尝试抓取该节点/内部文本时,htmlagilitypack将找不到它。有没有人在页面的源代码中看到任何可能阻止我的奇怪内容?

我是新手,并且仍在学习人们如何阻止我刮擦,任何提示或技巧都很乐意欣赏!

P.S。我观察了有关机器人等的所有网站规则,但我注意到这种奇怪的行为并将其视为一种挑战。

2 个答案:

答案 0 :(得分:1)

好的,看来我的xpaths里面有tbody。当我从xpath手动删除这些tbodys时,HTMLAgilityPack可以很好地处理它。

我仍然想知道为什么我会收到无效的xpath,但是现在我已回答了我的问题。

答案 1 :(得分:0)

我认为除非我的xpath知识存在缺陷(可能),否则问题在于xpath表达式中的/ tbody节点。

当我这样做时

 string test = string.Empty;
StreamReader sr = new StreamReader(@"C:\gs.htm");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(sr);
sr.Close();
sr = null;
string xpath = @"//table[@id='Home']/tr[3]/td";
test = doc.DocumentNode.SelectSingleNode(xpath).InnerText;

工作正常..返回一个
“COLUMBUS BLUE JACKETSGame 5 Home Game 3”
我希望是你想要的字符串。

检查html我找不到/ tbody。