[英]How to get inner text from span which include other hidden span?
我有一些测试HTML页面
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Page for test</title>
</head>
<body>
<div class="r_tr">
<span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span>
</div>
</body>
</html>
我想获取“内部文字”。 我正在使用HtmlAgilityPack。 我写这个方法
public string GetInnerTextFromSpan(HtmlDocument doc)
{
const string rowXPath = "//*[@class=\"r_tr\"]";
const string spanXPath = "//*[@class=\"r_rs\"]";
string text = null;
HtmlNodeCollection rows = doc.DocumentNode.SelectNodes(rowXPath);
foreach(HtmlNode row in rows)
{
text = row.SelectSingleNode(spanXPath).InnerText;
Console.WriteLine("textL {0}", text);
}
return text;
}
但是此方法返回“内部texttext”。 我写一些单元测试来解释我的问题
[Test]
public void TestGetInnerTextFromSpan()
{
var client = new PromtTranslatorClient();
var doc = new HtmlDocument();
doc.Load(@"testPage.html");
var text = client.GetInnerTextFromSpan(doc);
StringAssert.AreEqualIgnoringCase("Inner text", text);
}
和结果
Expected string length 10 but was 14. Strings differ at index 10.
Expected: "Inner text", ignoring case
But was: "Inner texttext"
---------------------^
我不知道XPath,但这是使用LINQ的解决方案:
String inner = (from x in doc.DocumentNode.Descendants()
where x.Name == "span"
&& x.Attributes["class"].Value == "r_rs"
select
(from y in x.ChildNodes
where y.Name == "#text"
select y.InnerText).FirstOrDefault()
).FirstOrDefault();
首先,您的spanXPath
不正确。 //
在开头表示“从根开始”,因此row.SelectSingleNode(spanXPath)
将始终在文档中而不是r_rs
中给出类r_rs
的第一个元素。 删除//
以解决此问题。
然后, text()
是文本节点的XPath。 您可以使用
var span = row.SelectSingleNode(spanXPath);
var textNode = span.SelectSingleNode("text()");
text = textNode.InnerText;
Console.WriteLine("textL {0}", text);
在您的foreach
循环中获取所选范围中的第一个文本节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.