【问题标题】:Python – break up a bs4.element.NavigableString (xml parsed with BeautifulSoup)Python – 分解 bs4.element.NavigableString(用 BeautifulSoup 解析的 xml)
【发布时间】:2021-08-16 03:33:32
【问题描述】:

Ï 有一个半解析的 xml 结果。我称它为半因为它有点工作,有点不工作。这是因为原始文件是“半格式”。

我尝试过使用元素树进行解析,但效果更差,所以返回到使用 BeautifulSoup 进行解析。

我需要帮助获取孩子们的名字,下面是“Line”。

我有很多孩子,最高级的如下:

<Line> 
<ID>0b10-bd-59-ac-bac</ID>
<Type ref="cc-63-5c-bf-01"/>
<Base ref="8c-20-59-b7-eb"/>
<length multiplier="none" unit="m">28.536756216711005</length>
<b0ch multiplier="none" unit="S"/>
<bch multiplier="none" unit="S"/>
<r multiplier="none" unit="ohm">0.03361629882328556</r>
<r0 multiplier="none" unit="ohm">0.033624859850150575</r0>
<x multiplier="none" unit="ohm">0.008802762240586673</x>
<x0 multiplier="none" unit="ohm">1.1414702486684403E-05</x0>
</Line>

当我在“线”下面列出信息时,我得到:

[<ID>0b10-bd-59-ac-bac</ID>, <Type ref="cc-63-5c-bf-01"/>, <Base ref="8c-20-59-b7-eb"/>, <length multiplier="none" unit="m">28.536756216711005</length>, <b0ch multiplier="none" unit="S"/>, <bch multiplier="none" unit="S"/>, <r multiplier="none" unit="ohm">0.03361629882328556</r>, <r0 multiplier="none" unit="ohm">0.033624859850150575</r0>, <x multiplier="none" unit="ohm">0.008802762240586673</x>, <x0 multiplier="none" unit="ohm">1.1414702486684403E-05</x0>]

列表中的元素,我可以将 bs4.element.NavigableString 转换为字符串,然后按我的意愿排序。

但是当我尝试获取信息的“父级”时,它会返回“子级”的整个第一瞬间,代码与上面相同,以 , 开始和停止。

我无法处理大量信息。不能整体转成字符串。

当遍历所有孩子时,我不知道第一个孩子的名字,也不知道下一个孩子的名字。

如何在不知道名字或名字长度的情况下提取这些信息?

【问题讨论】:

    标签: python xml beautifulsoup


    【解决方案1】:

    编辑:看起来您正在尝试解析 XML。也许你应该看看这个更简单的方法,而不是使用 BeautifulSoup:https://www.edureka.co/blog/python-xml-parser-tutorial/

    使用这种方法,你可以做到

    import xml.etree.ElementTree as ET
    data='''
    <Line> 
    <ID>0b10-bd-59-ac-bac</ID>
    <Type ref="cc-63-5c-bf-01"/>
    <Base ref="8c-20-59-b7-eb"/>
    <length multiplier="none" unit="m">28.536756216711005</length>
    <b0ch multiplier="none" unit="S"/>
    <bch multiplier="none" unit="S"/>
    <r multiplier="none" unit="ohm">0.03361629882328556</r>
    <r0 multiplier="none" unit="ohm">0.033624859850150575</r0>
    <x multiplier="none" unit="ohm">0.008802762240586673</x>
    <x0 multiplier="none" unit="ohm">1.1414702486684403E-05</x0>
    </Line>
    '''
    myroot = ET.fromstring(data)
    print(myroot.tag)
    
    > Line
    

    和

    print(myroot[0].tag)
    
    > ID
    

    和

    for x in myroot:
         print(x.tag, x.attrib, x.text)
    
    > ID {} 0b10-bd-59-ac-bac
    > Type {'ref': 'cc-63-5c-bf-01'} None
    > Base {'ref': '8c-20-59-b7-eb'} None
    > length {'multiplier': 'none', 'unit': 'm'} 28.536756216711005
    > b0ch {'multiplier': 'none', 'unit': 'S'} None
    > bch {'multiplier': 'none', 'unit': 'S'} None
    > r {'multiplier': 'none', 'unit': 'ohm'} 0.03361629882328556
    > r0 {'multiplier': 'none', 'unit': 'ohm'} 0.033624859850150575
    > x {'multiplier': 'none', 'unit': 'ohm'} 0.008802762240586673
    > x0 {'multiplier': 'none', 'unit': 'ohm'} 1.1414702486684403E-05
    

    例如:

    myroot[3].tag, myroot[3].attrib['unit'], myroot[3].text
    
    > ('length', 'm', '28.536756216711005')
    

    【讨论】:

    • 问题是获取文本/名称'Line',我可以使用列表中的元素,但列表仅包含'Line'以下级别的信息。
    • 你能发布代码吗?我仍然认为解决方案只是不使用名称,或者先列出名称。
    • 我修复了这个问题,以便以更简单的方式实际解析它。如果你问我,BeautifulSoup 是相当复杂的。如果您喜欢,请接受答案,我是新来的,正在努力争取一些声誉:)
    • 谢谢,但正如介绍中提到的,我尝试使用元素树进行解析,但它不起作用。我不知道为什么(我猜是文件设置)。 BeautifulSoup 部分工作,解析后我得到了一些功能,而有些则没有。我现在的问题是我可以读取所有行,但不能读取第一行和最后一行(“行”)。当我尝试询问一个字符串的“父级”时,我得到了整个组合的东西。我无法分离出“线路”信息。整个组合的东西是一个 bs4.element.NavigableString,这再次意味着不可能转换为字符串(或者我还没有找到方法)。
    • 问题中的代码是解析后的样子。 'Line' 是 xml 文件中的顶级 'children' 之一。
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2015-07-09
    • 2016-08-04
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多