【发布时间】:2012-02-15 02:07:22
【问题描述】:
这是我尝试在 ASP.Net (C#) 中使用 Html Agility Pack 解析的示例 HTML。
<div class="content-div">
<dl>
<dt>
<b><a href="1.html" title="1">1</a></b>
</dt>
<dd> First Entry</dd>
<dt>
<b><a href="2.html" title="2">2</a></b>
</dt>
<dd> Second Entry</dd>
<dt>
<b><a href="3.html" title="3">3</a></b>
</dt>
<dd> Third Entry</dd>
</dl>
</div>
我想要的价值观是:
- 超链接 -> 1.html
- 锚文本 ->1
- 内部文本 od dd -> 第一个条目
(我在这里以第一个条目为例,但我想要列表中所有条目的这些元素的值)
这是我目前使用的代码,
var webGet = new HtmlWeb();
var document = webGet.Load(url2);
var parsedValues=
from info in document.DocumentNode.SelectNodes("//div[@class='content-div']")
from content in info.SelectNodes("dl//dd")
from link in info.SelectNodes("dl//dt/b/a")
.Where(x => x.Attributes.Contains("href"))
select new
{
Text = content.InnerText,
Url = link.Attributes["href"].Value,
AnchorText = link.InnerText,
};
GridView1.DataSource = parsedValues;
GridView1.DataBind();
问题是我正确地获得了链接和锚文本的值,但是对于它的内部文本,它只取第一个条目的值,并为所有其他条目填充相同的值,总次数元素发生,然后从第二个开始。我的解释可能不太清楚,所以这是我使用此代码得到的示例输出:
First Entry 1.html 1
First Entry 2.html 2
First Entry 3.html 3
Second Entry 1.html 1
Second Entry 2.html 2
Second Entry 3.html 3
Third Entry 1.html 1
Third Entry 2.html 2
Third Entry 3.html 3
而我试图得到
First Entry 1.html 1
Second Entry 2.html 2
Third Entry 3.html 3
我对 HAP 很陌生,对 xpath 知之甚少,所以我确信我在这里做错了,但即使花了几个小时我也无法让它工作。任何帮助将不胜感激。
【问题讨论】:
标签: c# asp.net screen-scraping html-agility-pack