【问题标题】:How can I read an HTML file a Paragraph at a time?如何一次读取一个段落的 HTML 文件?
【发布时间】:2014-02-12 22:42:39
【问题描述】:

我认为它类似于(伪代码):

var pars = new List<string>();
string par;
while (not eof("Platypus.html"))
{
    par = getNextParagraph();
    pars.Add(par);
}

...getNextParagraph() 查找下一个"&lt;p&gt;" 并继续直到找到"&lt;/p&gt;",烧毁它后面的桥(“剪切”段落,以便一遍又一遍地找不到它)。或者类似的。

有没有人知道如何准确地做到这一点/更好的方法?

更新

我尝试使用 Aurelien Souchet 的代码。

我有以下用途:

using HtmlAgilityPack;
using HtmlDocument = System.Windows.Forms.HtmlDocument;

...但是这段代码:

HtmlDocument doc = new HtmlDocument();

不需要(“此处无法访问私有构造函数'HtmlDocument'”)

此外,“doc.LoadHtml()”和“doc.DocumentNode”都给出旧的“无法解析符号'Bla'”错误消息

更新 2

好的,我必须在前面加上“HtmlAgilityPack”。以便消除歧义。

【问题讨论】:

  • 在 StackOverflow 上查看 question
  • 您是否可以控制要解析的 html?您如何确定“段落”是什么? P标签?那些不一致的 Web 开发人员呢?你在寻找 DIV 标签吗? BR 标签?你能保证你所读内容的一致性吗?如果不是,那么您正在谈论一项艰巨的任务。问题本身很笼统,归结为“如何解析html”,关于解析html的问题已经在这里讨论过很多次了……stackoverflow.com/search?q=parse+html
  • 当然,如果您只是想要 P 标签并且不关心有很多开发人员随心所欲地做任何事情,而不遵循任何给定的标准,那么前面的注释是无效的。
  • 如果您不介意使用 Html Agility Pack,我认为您可以获得段落标签的集合,然后您可以对其进行迭代。 htmlagilitypack.codeplex.com
  • 只需使用 HTMLAgility 包并选择所有 p 标签似乎是一个不错的第一次尝试。阅读 HTML 文件中的所有段落也是说明问题的更好方法,因为文件不一定有任何内容。 PS如果它们是嵌套的怎么办?

标签: c# html text documentation-generation paragraph


【解决方案1】:

正如人们在 cmets 中建议的那样,我认为 HtmlAgilityPack 是最好的选择,它易于使用并且可以找到好的示例或教程。

这是我要写的:

//don't forgot to add the reference
using HtmlAgilityPack;

//Function that takes the html as a string in parameter and return a list
//of strings with the paragraphs content.
public List<string> GetParagraphsListFromHtml(string sourceHtml)
{

   var pars = new List<string>();

   //first create an HtmlDocument
   HtmlDocument doc = new HtmlDocument();

   //load the html (from a string)
   doc.LoadHtml(sourceHtml);

   //Select all the <p> nodes in a HtmlNodeCollection
   HtmlNodeCollection paragraphs = doc.DocumentNode.SelectNodes(".//p");

   //Iterates on every Node in the collection
   foreach (HtmlNode paragraph in paragraphs)
   {
      //Add the InnerText to the list
      pars.Add(paragraph.InnerText); 
      //Or paragraph.InnerHtml depends what you want
   }

   return pars;
}

这只是一个基本示例,您可以在 html 中包含一些嵌套段落,然后此代码可能无法按预期工作,这完全取决于您正在解析的 html 以及您想用它做什么。

希望对你有帮助!

【讨论】:

  • 看起来很有希望,谢谢! InnerText 和 InnerHTML 之间有什么区别?我在这里看到:stackoverflow.com/questions/19030742/…
  • 我认为 InnerHtml 会给出

    标签之间的所有内容,包括其他 html,如 等......当 InnerText 只给出没有 Html 的文本时。但是你自己试试看,开头或结尾经常有一些空格,所以你可能想使用 .Trim()
  • 在这里查看我的答案:stackoverflow.com/questions/21788078/…
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2012-10-13
  • 2011-02-28
  • 2020-10-24
相关资源
最近更新 更多