为什么 HtmlAgilityPack 在某些 EPUB 文档中看不到正文

Why HtmlAgilityPack doesn't see the body in some EPUB documents

提问人:khantazm 提问时间:8/12/2023 更新时间:8/12/2023 访问量:27

问:

我正在尝试使用 HtmlAgilityPack 解析 EPUB 文档(使用 VersOne.Epub 打开),它开始工作,但随着我测试的更多,它开始在一些书中缺少正文。

最初我测试了英语书籍,问题首先出现在俄语书籍中,我认为字母表或编码是问题所在,但事实似乎并非如此,因为我设法通过转到“/html/body”或只是“//body”来获得一本书的正文。但这在最新的版本中不起作用。例如,这个简短的部分:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title/>
<link rel="stylesheet" href="style.css" type="text/css"/>
<link rel="stylesheet" href="style.css" type="text/css"/>
</head>
<body class="z">
<span id="id154"><div class="title3">
<p class="p">295</p>
</div><p class="p1">От слова bando - публичное оповещение - произошло слово bando-lero, означавшее разбойника, голова которого была оценена.</p></span>
</body>
</html>

Epub 库可以很好地获取字符串。html 标签已关闭,请检查。正文标签已关闭,请检查。给出了编码。HtmlAgilityPack 返回 null。可能是什么问题?

以防万一,这是我正在做的事情:

HtmlDocument htmlDocument = new();
htmlDocument.LoadHtml(textContentFile.Content);
var bodyNode = htmlDocument.DocumentNode.SelectSingleNode("//body");

textContentFile 来自 Epub 读取顺序。

c# html-agility-pack epub

评论

0赞 jdweng 8/12/2023
发布工作回复,以便我们比较差异。数据是 XML 而不是 HTML,即使第一个子标记称为 HTML。XML 和 HTML 相似但不相同。不能对所有 XML 文件使用 HTML Agility 包。请改用 XML 库。看起来该文件有一个命名空间,这可能是问题所在。

答:

0赞 jdweng 8/12/2023 #1

请尝试以下操作:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = @"<?xml version=""1.0"" encoding=""UTF - 8""?>
                     <html xmlns = ""http://www.w3.org/1999/xhtml"" >
                         <head>
                           <title/>
                           <link rel = ""stylesheet"" href = ""style.css"" type = ""text/css"" />
                           <link rel = ""stylesheet"" href = ""style.css"" type = ""text/css"" />
                         </head >
                        <body class=""z"">
                           <span id = ""id154"" >
                              <div class=""title3"">
                                 <p class=""p"">295</p>
                              </div>
                              <p class=""p1"">От слова bando - публичное оповещение - произошло слово bando-lero, означавшее разбойника, голова которого была оценена.</p></span>
                        </body>
                    </html>
";
            XDocument doc = XDocument.Parse(xml);
            XNamespace ns = doc.Root.GetDefaultNamespace();

            XElement body = doc.Descendants(ns + "body").FirstOrDefault();
        }
 

    }

 
}