这是我试图用ASP.Net (C#)中的解析的示例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>我想要的价值观是:
(我已经在这里举了第一个条目的例子,但是我想要列表中所有条目的这些元素的值)
这是我目前使用的代码,
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知之甚少,所以我确信我在这里做错了什么,但即使花了几个小时,我也无法使它工作。任何帮助都将不胜感激。
发布于 2012-01-20 14:32:35
解决方案1
我已经定义了一个函数,给定一个dt节点将在它之后返回下一个dd节点:
private static HtmlNode GetNextDDSibling(HtmlNode dtElement)
{
var currentNode = dtElement;
while (currentNode != null)
{
currentNode = currentNode.NextSibling;
if(currentNode.NodeType == HtmlNodeType.Element && currentNode.Name =="dd")
return currentNode;
}
return null;
}现在可以将LINQ代码转换为:
var parsedValues =
from info in document.DocumentNode.SelectNodes("//div[@class='content-div']")
from dtElement in info.SelectNodes("dl/dt")
let link = dtElement.SelectSingleNode("b/a[@href]")
let ddElement = GetNextDDSibling(dtElement)
where link != null && ddElement != null
select new
{
Text = ddElement.InnerHtml,
Url = link.GetAttributeValue("href", ""),
AnchorText = link.InnerText
};解决方案2
不增加其他职能:
var infoNode =
document.DocumentNode.SelectSingleNode("//div[@class='content-div']");
var dts = infoNode.SelectNodes("dl/dt");
var dds = infoNode.SelectNodes("dl/dd");
var parsedValues = dts.Zip(dds,
(dt, dd) => new
{
Text = dd.InnerHtml,
Url = dt.SelectSingleNode("b/a[@href]").GetAttributeValue("href", ""),
AnchorText = dt.SelectSingleNode("b/a[@href]").InnerText
});发布于 2012-01-20 15:02:05
例如,如何使用Html Agility Pack解析某些元素
public string ParseHtml()
{
string output = null;
HtmlDocument htmldocument = new HtmlDocument();
htmldocument.LoadHtml(YourHTML);
HtmlNode node = htmldocument.DocumentNode;
HtmlNodeCollection dds = node.SelectNodes("//dd"); //Select all dd tags
HtmlNodeCollection anchors = node.SelectNodes("//b/a[@href]"); //Select all 'a' tags that contais href attribute
for (int i = 0; i < dds.Count; i++)
{
string atributteValue = null.
Text = dds[i].InnerText;
Url = anchors[i].GetAttributeValue("href", atributteValue);
AnchorText = anchors[i].InnerText;
//Your code...
}
return output;
}https://stackoverflow.com/questions/8942595
复制相似问题