【发布时间】:2015-03-06 01:09:21
【问题描述】:
我在寻找解析网站链接的确切方法时遇到了一些麻烦。 Using firebug,该表的确切 xPath 是:
/html/body/div/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/div/table/tbody/tr[3]/td/div/table/tbody/tr/td/div/table
它还有一个 id ='ctl00_cp1_GridView1'(这并不是很有帮助)。
我要做的就是找到第一个中的所有链接并将它们添加到列表中。
这是我当前的代码 sn-p(有一些帮助 from this post:
protected void btnSubmitURL_Click(object sender, EventArgs e)
{
try
{
List<string> siteList = new List<string>();
int counter = 1;
var web = new HtmlWeb();
var doc = web.Load(txtURL.Text);
var table = doc.DocumentNode.SelectSingleNode("html/body/div/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/div/table/tbody/tr[3]/td/div/table/tbody/tr/td/div/table[@id='ctl00_cp1_GridView1']/tbody");
HtmlNodeCollection rows = table.SelectNodes("./tr");
if (rows != null)
{
for (int i = 0; i < rows.Count; i++)
{
HtmlNodeCollection cols = rows[i].SelectNodes("./td[1]");
if (cols != null)
{
for (int j = 0; j < cols.Count; j++)
{
HtmlNode aTags = cols[i].SelectSingleNode("./a[@id='NormalColoredFont']");
if (aTags != null)
{
siteList.Add(counter + ". " + aTags.InnerHtml + " - " + aTags.Attributes["href"].Value);
}
}
}
}
}
lblOutput.Text = siteList.Count.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
我在 HtmlNodeCollection 行中不断收到 Null Exception 错误,因为它找不到该特定表。我已经尝试通过表 id 进行搜索,但这也没有帮助。
如果能提供有关获取该表的任何帮助,我们将不胜感激。
【问题讨论】:
-
你为什么不用
ctl00_cp1_GridView1的id?这将使您更接近有问题的元素,而不是那个路径(它极可能改变,而不是 ID)。 -
在使用多个索引器时,HtmlAgilityPack 中有一个错误,我以前见过这个。不知道为什么会这样。为什么不直接使用
//table[@id='ctl00_cp1_GridView1']//a[@href]来抓取表格下的所有链接? -
我已经尝试使用 jessehouwing 提出的建议,并且能够到达餐桌,但不幸的是我无法检索所有链接。所以我切换回只使用 casperOne 建议的表 id,代码现在一直运行,直到提取所有 标记。它按 id 访问表格,选择所有
标签,然后选择 标签,然后被 标签清空。有谁认为问题可能是 ?
标签: c# .net html-agility-pack