Python — 解析文件(docx、pdf 和 odt)并将内容转换为我的数据模型

Python -- Parsing files (docx, pdf and odt) and converting the content into my data model

我正在编写一个导入/导出工具,用于导入 docx、pdf 和 odt 文件;其中写了一本书。

我们已经有了一个用于 .epub 格式的工具,并且我们希望在此基础上扩展功能,以便该网站的用户可以拥有更大的灵活性。

到目前为止,我查看了 PDFMiner,还发现 docx 只是基于 openxml 格式,所以 word/document.xml 本质上是包含整个内容的文件,我可以用 lxml 解析它。

我的问题是:我希望解析这些文件的内容,并从该内容中提取章节名称、图像(如果有)和章节文本等内容,以便将内容放入数据模型:

Book --> o2m --> Chapter --> o2m --> Image
import zipfile

try:

  from xml.etree.cElementTree import XML

  print("cElementTree")

except ImportError:

  from xml.etree.ElementTree import XML

  print("ElementTree")
'word/document.xml''word/footnotes.xml''word/endnotes.xml'

很明显,PDFMiner 有一个 .get_outlines() 函数可以为我返回 TOC。但它不能将任何返回的元组(章节编号和标题)链接到该章节的实际页面。

更成问题的是 docx/odt;这些只是段落 -- -- 元素,带有 attrs 和子元素。

我正在寻找从这些文件类型中推断出某种结构感的想法,如果需要,我可以将这些想法(2 或 3)应用为我们希望通过以下方式导入书籍的用户的建议格式这些文件格式之一。


Textract 是迄今为止我遇到的用于解析不同文件格式的最佳工具。

它可以解析大多数文件格式。

你可以在 Github 上找到该项目

这里是官方文档


(Python 3 答案)

当我在寻找一种读取 .docx 文件的工具时,我在这里找到了一个:http://etienned.github.io/posts/extract-text-from-word-docx-simply/

它所做的只是从 .docx 文件中获取文本并将其作为字符串返回;单独的段落仍然明显分开,因为之间有新的行,但所有其他格式都丢失了。我认为这可能包括丢失尾注和脚注,但如果你想要正文,它会很好。

我在 Windows 10 和 OS X 上都对其进行了测试,并且在两者上都成功运行。这是它导入的内容:

Book --> o2m --> Chapter --> o2m --> Image
import zipfile

try:

  from xml.etree.cElementTree import XML

  print("cElementTree")

except ImportError:

  from xml.etree.ElementTree import XML

  print("ElementTree")
'word/document.xml''word/footnotes.xml''word/endnotes.xml'

编辑:

如果在函数体中替换

Book --> o2m --> Chapter --> o2m --> Image
import zipfile

try:

  from xml.etree.cElementTree import XML

  print("cElementTree")

except ImportError:

  from xml.etree.ElementTree import XML

  print("ElementTree")
'word/document.xml''word/footnotes.xml''word/endnotes.xml'

Book --> o2m --> Chapter --> o2m --> Image
import zipfile

try:

  from xml.etree.cElementTree import XML

  print("cElementTree")

except ImportError:

  from xml.etree.ElementTree import XML

  print("ElementTree")
'word/document.xml''word/footnotes.xml''word/endnotes.xml'

Book --> o2m --> Chapter --> o2m --> Image
import zipfile

try:

  from xml.etree.cElementTree import XML

  print("cElementTree")

except ImportError:

  from xml.etree.ElementTree import XML

  print("ElementTree")
'word/document.xml''word/footnotes.xml''word/endnotes.xml'

你可以分别得到脚注和尾注。

但是,它们在文本中所在位置的标记丢失了。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161