【问题标题】:Python lxml - get index of tag's textPython lxml - 获取标签文本的索引
【发布时间】:2012-09-10 14:40:17
【问题描述】:

我有一个格式类似于 docx 的 xml 文件,即:

<w:r>
  <w:rPr>
    <w:sz w:val="36"/>
    <w:szCs w:val="36"/>
  </w:rPr>
  <w:t>BIG_TEXT</w:t>
</w:r>

我需要在源 xml 中获取BIG_TEXT 的索引,例如:

from lxml import etree
text = open('/devel/tmp/doc2/word/document.xml', 'r').read()

root = etree.XML(text)

start = 0
for e in root.iter("*"):
    if e.text:
        offset = text.index(e.text, start)
        l = len(e.text)
        print 'Text "%s" at offset %s and len=%s' % (e.text, offset, l)
        start = offset + l

我可以从当前index + len(text) 的位置开始新的搜索,但是还有其他方法吗?元素可能只有一个字符,例如w。它将找到w 的索引,而不是标签文本w 的索引。

【问题讨论】:

  • 您希望索引具有什么价值?行号+列?字节偏移?到目前为止,您尝试了哪些方法,但没有成功?

标签: python xml lxml


【解决方案1】:

我正在寻找一个类似的解决方案(在一个大的 xml 文件中索引节点以便快速查找)。

  • AFAIK,lxml 只提供源代码,这是不够的。参照APIOriginal line number as found by the parser or None if unknown.
  • expat 提供了文件中的确切偏移量:CurrentByteIndex
    • start_element处理程序中获取,它返回标签的开始(即'&lt;')偏移量。
    • char_data 处理程序中获取,它返回数据的开始(即您的示例中的'B')偏移量。

例子:

import xml.parsers.expat

# handler functions for parser events, and housekeeping.
class handler :
   def __init__(self, current_parser) :
      #tag of interest
      self.TARGET_TAG = "w:t"

      #set up parser
      self.parser = current_parser
      self.parser.StartElementHandler  = self.start_element
      self.parser.EndElementHandler    = self.end_element
      self.parser.CharacterDataHandler = self.char_data

      self.target_tag_met = False
      self.index = None

   def start_element(self, name, attrs):
      self.target_tag_met = (name == self.TARGET_TAG)

   def end_element(self, name) :
      self.target_tag_met = False

   def char_data(self, data):
      if self.target_tag_met :
         self.index = self.parser.CurrentByteIndex

#open file in binary mode for robuster byte offsets.
xmlFile = open("so_test.xml", 'rb')

p = xml.parsers.expat.ParserCreate()
h = handler(p)

p.ParseFile(xmlFile)
print (h.index)

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多