【问题标题】:Easy way to get data between tags of xml or html files in python?在python中获取xml或html文件标签之间数据的简单方法?
【发布时间】:2010-01-19 23:07:57
【问题描述】:

我正在使用 Python,需要查找和检索标签之间的所有字符数据:

<tag>I need this stuff</tag>

然后我想将找到的数据输出到另一个文件。我只是在寻找一种非常简单有效的方法来做到这一点。

如果您可以发布一个快速代码 sn-p 来描绘易用性。因为我在理解解析器时遇到了一些麻烦。

【问题讨论】:

    标签: python html xml


    【解决方案1】:

    没有外部模块,例如

    >>> myhtml = """ <tag>I need this stuff</tag>
    ... blah blah
    ... <tag>I need this stuff too
    ... </tag>
    ... blah blah """
    >>> for item in myhtml.split("</tag>"):
    ...   if "<tag>" in item:
    ...       print item [ item.find("<tag>")+len("<tag>") : ]
    ...
    I need this stuff
    I need this stuff too
    

    【讨论】:

    • 所谓的“最佳”方法是主观的。取决于要解决的问题。如果任务简单,那就用简单的方法
    【解决方案2】:

    这就是我的做法:

        (myhtml.split('<tag>')[1]).split('</tag>')[0]
    

    告诉我它是否有效!

    【讨论】:

      【解决方案3】:

      我非常喜欢解析成element tree,然后使用element.textelement.tail

      它还有xpath之类的搜索

      >>> from xml.etree.ElementTree import ElementTree
      >>> tree = ElementTree()
      >>> tree.parse("index.xhtml")
      <Element html at b7d3f1ec>
      >>> p = tree.find("body/p")     # Finds first occurrence of tag p in body
      >>> p
      <Element p at 8416e0c>
      >>> p.text
      "Some text in the Paragraph"
      >>> links = p.getiterator("a")  # Returns list of all links
      >>> links
      [<Element a at b7d4f9ec>, <Element a at b7d4fb0c>]
      >>> for i in links:             # Iterates through all found links
      ...     i.attrib["target"] = "blank"
      >>> tree.write("output.xhtml")
      

      【讨论】:

        【解决方案4】:

        Beautiful Soup 是一个很棒的 Python 的 HTML/XML 解析器:

        Beautiful Soup 是 Python HTML/XML 专为快速周转而设计的解析器 像屏幕抓取这样的项目。三 功能使其功能强大:

        1. Beautiful Soup 不会因为你的错误标记而窒息。它产生一个 解析树大约为 与您的原始文件一样有意义。 这通常足以收集 你需要的数据然后逃跑。
        2. Beautiful Soup 提供了一些简单的方法和 Pythonic 成语 导航、搜索和修改 解析树:用于剖析 记录并提取您需要的内容。 您不必创建自定义 每个应用程序的解析器。
        3. Beautiful Soup 自动将传入的文档转换为 Unicode 并将传出文档转换为 UTF-8。你 不必考虑编码, 除非文件没有指定 编码和美丽的汤不能 自动检测一个。然后你只需要 指定原始编码。

        【讨论】:

          【解决方案5】:

          使用xpath和lxml;

          from lxml import etree
          
          pageInMemory = open("pageToParse.html", "r")
          
          parsedPage = etree.HTML(pageInMemory)
          
          yourListOfText = parsedPage.xpath("//tag//text()")
          
          saveFile = open("savedFile", "w")
          saveFile.writelines(yourListOfText)
          
          pageInMemory.close()
          saveFile.close()
          

          比美丽的汤更快。

          如果你想测试你的 Xpath - 我找到 FireFox's Xpather extremely helpful

          补充说明:

          【讨论】:

          • 我想删除 标签中的文本的 标签。那么如何实现它。例如

            Abstract-作为一种很有前途的处理各种无线信道性能衰落的方法,MIMO技术在支持可靠,高数据速率传输。而无线系统必须应对时空相关性和快速 Rician 衰落。

            提前致谢
          【解决方案6】:
          def value_tag(s):
              i = s.index('>')
              s = s[i+1:]
              i = s.index('<')
              s = s[:i]
              return s
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-13
            • 1970-01-01
            • 2013-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-11
            相关资源
            最近更新 更多