【问题标题】:Python3 - Append each character to a string (making a line)Python3 - 将每个字符附加到字符串(制作一行)
【发布时间】:2019-11-09 04:05:14
【问题描述】:

我有一个 XML 元素,看起来像这样:

XML

<page>
    <textline id="1">
        <text>C</text>
        <text>o</text>
        <text>n</text>
        <text>t</text>
        <text>a</text>
        <text>k</text>
        <text>t</text>
    </textline>
    <textline id="2">
        <text>
        </text>
    </textline>
    <textline id="3">
        <text>M</text>
        <text>e</text>
    </textline>
</page>

我正在尝试all获得&lt;textline&gt;标签only

with open(path_to_xml_file) as xml_file:    
     parsed_xml = BeautifulSoup(xml_file, 'xml')
     text_lines = parsed_xml.find_all("textline")

但是,text_lines 包括 &lt;textline&gt; 的所有子级 - 这意味着它包括所有 &lt;text&gt;&lt;/text&gt; 标记。

我似乎在文档中找不到任何解释如何只选择实际标签(而不是任何子、子子等)的内容。

我找到了 recursive=False 选项,它应该只选择 direct 孩子,所以我想我可以将它应用到 page 标签:

text_lines = parsed_xml.find_all("page", recursive=False)

但这会返回一个空列表:[]

预期结果:

<textline id="1"></textline>
<textline id="2"></textline>
<textline id="3"></textline>

【问题讨论】:

  • 您的预期结果是什么?如果您不介意生孩子,您可以尝试计算textline 标签。
  • 您期望的输出是什么?
  • 大家好 - 刚刚用预期的结果更新了我的原始帖子。
  • 我认为 BeautifulSoup 无法打开文件 - 它需要带有 html/xml 的文本而不是文件名。或者你必须使用open() - BeautifulSoup(open('myXMLfile.xml'), 'xml') - 见documentation

标签: python xml python-3.x beautifulsoup


【解决方案1】:

你可以设置string=''

例如:

xml = """<page>
<textline id="1">
  <text>C</text>
  <text>o</text>
  <text>n</text>
  <text>t</text>
  <text>a</text>
  <text>k</text>
  <text>t</text>
</textline>
<textline id="2">
  <text>
  </text>
</textline>
<textline id="3">
  <text>M</text>
  <text>e</text>
</textline>
</page>"""

from bs4 import BeautifulSoup
parsed_xml = BeautifulSoup(xml, 'xml')
text_lines = []
for tag in parsed_xml.find_all("textline"):
    tag.string = ''
    text_lines.append(tag)
print(text_lines)

输出:

[<textline id="1"></textline>,
 <textline id="2"></textline>,
 <textline id="3"></textline>]

【讨论】:

    【解决方案2】:

    您可以使用clear()方法从&lt;textline&gt;标签中删除所有内部&lt;text&gt;标签,

    还有一件事是你不能将文件名发送到BeautifulSoup,你必须打开它并将内容发送给它,这里我将xml内容保存在一个变量中。

    myxml = """<page>
    <textline id="1">
      <text>C</text>
      <text>o</text>
      <text>n</text>
      <text>t</text>
      <text>a</text>
      <text>k</text>
      <text>t</text>
    </textline>
    <textline id="2">
      <text>
      </text>
    </textline>
    <textline id="3">
      <text>M</text>
      <text>e</text>
    </textline>
    </page>"""
    
    parsed_xml = BeautifulSoup(myxml, 'xml')
    text_lines = parsed_xml.find_all("textline")
    for tl in text_lines:
        tl.clear()
    
    print(text_lines)
    

    输出:

    [<textline id="1"/>, <textline id="2"/>, <textline id="3"/>]
    

    【讨论】:

      【解决方案3】:

      我知道我最初用beautifulsoup 标记了这个问题,但我只是想分享我最终使用的内容。 @Rakesh 的解决方案确实适用于 beaufitulsoup。

      我实际上最终使用了 Python 内置的 XML 解析器:

      import xml.etree.ElementTree as ET
      
      tree = ET.parse(path_to_xml_file)
      root = tree.getroot()
      
      for textline in root.iter('textline'):
          print(textline)
      

      我认为这是一个更清洁的解决方案 - 所以希望这可以帮助任何人阅读这篇文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2013-05-08
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多