这是我试图在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
- 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了解很少,我肯定在做一些错误操作,但即使我花费了几个小时也无法让它工作。非常感谢任何帮助。
dt
标签,给我紧随其后的dd
标签”。我试图简化它,通过选择ddElement
作为dtElement.NextSibling
,但是HtmlAgilityPack将下一个节点视为<dt>
和<dd>
标签之间的空格。这导致我采用了稍微丑陋一些的解决方案,就像你上面看到的那样。 - Cristian LupascuZip
仅在4.0中受支持。但是,您可以使用Jon Skeet的此实现:http://msmvps.com/blogs/jon_skeet/archive/2011/01/14/reimplementing-linq-to-objects-part-35-zip.aspx。 - Cristian Lupascu