- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我有以下问题。
我的 html 格式不正确,在这种情况下,我无法使用 html 敏捷包选择节点。
代码如下:
string strHtml = @"
<html>
<div>
<p><strong>Elem_A</strong>String_A1_2 String_A1_2</p>
<p><strong>Elem_B</strong>String_B1_2 String_B1_2</p>
</div>
<div>
<p><strong>Elem_A</strong>String_A2_2 <String_A2_2> asdas</p>
<p><strong>Elem_B</strong>String_B2_2 String_B2_2</p>
</div>
</html>";
HtmlAgilityPack.HtmlDocument objHtmlDocument = new HtmlAgilityPack.HtmlDocument();
objHtmlDocument.LoadHtml(strHtml);
HtmlAgilityPack.HtmlNodeCollection colnodePs = objHtmlDocument.DocumentNode.SelectNodes("//p");
List<string> lststrText = new List<string>();
foreach (HtmlAgilityPack.HtmlNode nodeP in colnodePs)
{
lststrText.Add(nodeP.InnerHtml);
}
问题是 String_A2_2 被括在括号中。
所以 htmlagility pack 在 lststrText 中返回 5 个字符串而不是 4 个。
那么是否可以让 htmlagility pack 返回元素 3 作为 "<strong>Elem_A</strong>String_A2_2 <String_A2_2> asdas"
?
或者我可以做一些预处理来关闭元素?
lststrText的当前内容是
lststrText[0] = "<strong>Elem_A</strong>String_A1_2 String_A1_2"
lststrText[1] = "<strong>Elem_B</strong>String_B1_2 String_B1_2"
lststrText[2] = ""
lststrText[3] = ""
lststrText[4] = "<strong>Elem_B</strong>String_B2_2 String_B2_2"
最佳答案
大多数 html 解析器都试图构建一个有效的 DOM,这意味着不接受悬挂标签。它们将以某种方式转换或关闭。
如果只选择节点对你很重要,速度和大量数据不是问题,你可以用正则表达式获取所有
标签:
Regex reMatchP = new Regex(@"<(p)>.*?</\1>");
foreach (Match m in reMatchP.Matches(strHtml))
{
Console.WriteLine(m.Value);
}
此正则表达式假设
标签格式正确且闭合。
如果你要在你的程序中经常运行这个正则表达式,你应该将它声明为:
static Regex reMatchP = new Regex(@"<(p)>.*?</\1>", RegexOptions.Compiled);
[编辑:敏捷包更改]
如果您想使用 HtmlAgility 包,您可以修改 HtmlDocument.cs 中的 PushNodeEnd 函数:
if (HtmlNode.IsCDataElement(CurrentNodeName()))
{
_state = ParseState.PcData;
return true;
}
// new code start
if ( !AllowedTags.Contains(_currentnode.Name) )
{
close = true;
}
// new code end
其中 AllowedTags 是所有已知标签的列表:b、p、br、span、div 等。
输出不是您想要的 100%,但可能足够接近?
<strong>Elem_A</strong>String_A1_2 String_A1_2
<strong>Elem_B</strong>String_B1_2 String_B1_2
<strong>Elem_A</strong>String_A2_2 <ignorestring_a2_2></ignorestring_a2_2> asdas
<strong>Elem_B</strong>String_B2_2 String_B2_2
关于c# - 当没有关闭的 html 标签时,是否可以解决 HtmlAgilityPack 中的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928293/
HTML En son haber 01:029.023 代码 Dim request2 As HttpWebRequest = WebRequest.C
我正在使用 HtmlAgilityPack。我使用以下字符串创建一个 HtmlDocument 和 LoadHtml: OneTwo 这会做一些意想不到的事情。首先,它给出了两个解析器错误,EndTa
我需要从博客中获取一些帖子。一切都很顺利,直到我想获得帖子创建日期。它的 DOM 树是: div class="stories-feed__container" -> article -
我需要获取网页上的总字数。这个方法返回的数字是336。但是当我从wordcounter.net手动查看时,大约是1192个字。我怎样才能得到文章的字数? int kelimeSayisi()
使用 HtmlAgilityPack 和 c# 4.0 如何确定页面是否被重定向。我正在使用这种方法来加载页面。 HtmlDocument hdMyDoc = hwWeb.Load(srPageUrl
我正在尝试使用 HtmlAgilityPack 获取计时器的值,但是当我通过元素 ID 获取内部文本时,它会返回 --:--:-- 既然使用了AJAX,有什么方法可以获取时间值吗? 最佳答案 通过使用
jQuery改变后是否可以获取HtmlDocument?例如,在下次更改后通过“myId”获取元素。 js代码: $(document).ready(function () { $("#myC
我有以下 html 元素: MyString buttonText So,
我的目标是从网站上读出特定的容器/标签/属性(出于我的爱好),一切正常,除了为我的值(value)获取德语翻译(我通常在浏览器中手动打开网站时得到(可能是网站从用户代理获取特定信息),但如果我使用我的
是否可以在使用 HTMLAgilityPack 时忽略解析错误? 最佳答案 作为suggested by TrueWill ,您可能需要先清理 HTML,然后再尝试使用 HTMLAgilityPack
我正在使用 HtmlAgilityPack 在 C# Asp.Net 中执行 Scraping,到目前为止,我在从多个 Web 执行 Scratch 时没有遇到问题,但是,尝试弹出以下代码时出现错误
我在服务器上的解析器中使用 HTMLAgilityPack,但我正在解析的其中一个网站出现问题:每天早上 6 点左右,他们往往会关闭服务器进行维护,这会抛出 HTMLWeb 的 Load() 方法,并
这是我的html代码。如何在每个 div 标签后选择第一个链接(a) 我试过只使用一个斜杠://div[@class="test
我有异常抛出 gzip 不受支持。这就是我使用加载页面的全部内容,关于如何允许 gzip 的任何想法? HtmlWeb hwObject = new HtmlWeb();
我正在 SharePoint Foundation 中开发 C# ASP .NET WebPart。 一切正常,现在我想解析一个 HTML 页面以获取所有 ImagePaths 并将图像保存在 HD/
我一直在尝试使用 Html Agility Pack 在 Html 中附加一个新节点。 这是我的示例 Html
我想用这段代码解析一个 html 文件: ...... 问题是 HtmlAgilityPack 会自动关闭 div 结束标记之前的表单标记: ......所以当我解析表单时,一些表单元素丢失了。 (我
一般来说,我经常处理 html,并且总是使用 Regex 来获取结果。不过,每次我寻求帮助时,每个人都建议使用 HTML 解析器,例如 HTMLAgilitypack。 我刚刚试过了,伙计,现在对我来
当我删除一个节点(使用 keepGrandChildren )时,该节点同时包含文本和子节点,文本将一直推到子节点之后,而不是留在其原始位置。 示例: var doc = new HtmlDocume
我使用这段代码来获取页面信息但是现在站点已经更改并且我的应用程序返回空错误。 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDo
我是一名优秀的程序员,十分优秀!