防止使用InnerText时HTMLAgilityPack连接单词

6

我正在尝试从HTML文档中获取文本,这是一个简单的任务。因此,我使用HTMLdoc.DocumentNode.InnerText来实现这一点。问题是,在某些网站上,当不同标签内的单词之间没有空格时,DocumentNode.InnerText将这些单词连接成一个单词,使其无用。

例如,我正在阅读包含以下行的网站

<span>İstanbul</span><ul><li><a href="i1.htm">Adana</a></li>

我的结果是 "İstanbulAdana",这没有意义。

我在HTMLAgilityPack文档和Google上都找不到解决方案。

我是否漏掉了什么?

谢谢。


这是预期的行为。尝试循环遍历节点树并手动构建文本? - sisve
这正是应该发生的事情。在构建字符串时,您可以在循环内手动在每个节点之间插入空格。 - dtsg
如果您正在使用InnerText并正确选择节点,则不应返回任何HTML(标记)?然后使用上述描述的方法将起作用。或者,您可以在循环内部检查节点'InnerText'是否包含标记,如果是,则获取该标记的内部文本,然后将其添加到字符串列表中... - dtsg
你能否发布你正在使用的源文件,这样我就可以尝试一下? - dtsg
http://www.internethaber.com/gazetecilere-yalvardi-yakardi-sildiremedi-foto-galerisi-24214-p4.htm另外,看一下这个例子:<div>我的狗是<ul><li>艾伯特</li><li>艾萨克</li></ul></div> - meirlo
显示剩余3条评论
2个回答

11

这应该很容易做到。

const string html = @"<span>İstanbul</span><ul><li><a href=""i1.htm"">Adana</a></li>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
string result = string.Join(" ", doc.DocumentNode.Descendants()
  .Where(n => !n.HasChildNodes && !string.IsNullOrWhiteSpace(n.InnerText))
  .Select(n => n.InnerText));
Console.WriteLine(result); // prints "İstanbul Adana"

0

好的,这个代码片段在这个例子中会卡住:

const string html = @"<td><font size=""2"">abc </font><font size=""2"">(</font><font size=""2"">abc</font><font size=""2"">) </font><a href=""?query=abc"">abc</a>, abc<br><font size=""2"">abc </font>abc, <a href=""?query=abc"">abc</a>, abc, <a href=""?query=abc"">abc</a><br><font size=""2"">abc </font>abc abc, abc abc<br></td>";

如果没有连接子句,它就不会挂起(但它也无法正确地放置空格)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接