繁体   English   中英

如何将单个标签中具有多个属性值的 XML 解析为 DataFrame?

[英]How to parse XML with multiple attribute values within a single tag to DataFrame?

<?xml version="2.0" encoding="UTF-8" ?><timestamp="20220113">
<defintions>
    <defintion id="1" old_id="0">Lang</defintion>
    <defintion id="7" old_id="1">Eng</defintion>

我如何解析这样的 XML 文件? 在这里,我在一个标签中有多个值。 我想以listdataframe格式提取值,例如“ID”和“OLD_ID”。

您可以使用BeautifulSoupxml解析器来实现您的目标,只需 select 所需的元素并迭代ResultSet以通过.get()提取属性值。

with open('filename.xml', 'r') as f:
    file = f.read() 
    soup = BeautifulSoup(file, 'xml')

例子

from bs4 import BeautifulSoup
import pandas as pd

xml = '''<?xml version="2.0" encoding="UTF-8" ?><timestamp="20220113">
<defintions>
    <defintion id="1" old_id="0">Lang</defintion>
    <defintion id="7" old_id="1">Eng</defintion>
'''
soup = BeautifulSoup(xml,'xml')


pd.DataFrame(
    [
        (e.get('id'),e.get('old_id'))
        for e in soup.select('defintion')
    ],
    columns = ['id','old_id']
)

Output

ID 旧ID
0 1个 0
1个 7 1个

使用 python Beautiful Soup,您可以将 .xml 文件解析为 Beatuful soup object,然后使用.findAll('defintions')。 然后遍历找到的标签并获得所需的值

object.findAll('defintions')

for defintion in defintions:
    old_id = defintions['old_id']
    id = defintions['id']

参考资料: https://www.crummy.com/software/BeautifulSoup/bs4/doc/ https://linuxhint.com/parse_xml_python_beautifulsoup/

如果你有一个像XML 这样的有效值(时间戳标签不能有像属性这样的值):

<?xml version='1.0' encoding='utf-8'?>
<root timestamp='20220113'>
<defintions>
    <defintion id="1" old_id="0">Lang</defintion>
    <defintion id="7" old_id="1">Eng</defintion>
</defintions>
</root>

比你可以使用pandas

import pandas as pd

df = pd.read_xml('x89.xml', xpath='.//defintion')
print(df.to_string(index=False))

Output:

 id  old_id defintion
  1       0      Lang
  7       1       Eng

如何解析所有<p>特定范围内的标签</p><div>标签?</div><div id="text_translate"><p> 我正在使用 BeautifulSoup 来解析一些 html 页面。 我想在&lt;div id="commentary"&gt;链接下的&lt;p&gt;标记中获取所有文本信息,该<a href="https://i.stack.imgur.com/bKPxZ.png" rel="nofollow noreferrer">链接指向我想要获取的 html 脚本内容的图像</a></p><p>当我使用find_all获取所有&lt;p&gt;标记时,列表仅包含第一个。 我曾经按照代码来计算编号。 &lt;div&gt;下存在的&lt;p&gt;标签。 从上图中您可以清楚地看到,在突出显示的&lt;div&gt;标记中大约有 19 个&lt;p&gt;标记,但我的代码仍然打印出 1。</p><pre> content = soup.find('div', attrs={'class':'company-profile'}) points = content.find('div', attrs={'id':'commentary'}) count = 0 for point in points.find_all('p'): count = count + 1 print(count) print(points.text)</pre><p> 我不知道为什么会发生这种情况以及为什么find_all方法不会返回完整列表。 我还尝试使用points.text打印&lt;div id="commentary"&gt;标记中的所有文本,但它只打印第一个&lt;p&gt;标记的内容。</p><pre> (mlenv) chirag@debian10:~/ML/Finaments$ python main.py &lt;class 'bs4.element.Tag'&gt; State Bank of India is a Fortune 500 company. It is an Indian Multinational, Public Sector banking and financial services statutory body headquartered in Mumbai. It is the largest and oldest bank in India with over 200 years of history.# 1 1 Ratios (Q3FY21) Capital Adequacy Ratio - 14.50% Net Interest Margin - 3.34% Gross NPA - 4.77% Net NPA - 1.23% CASA Ratio - 45.15%# (mlenv) chirag@debian10:~/ML/Finaments$ ^C (mlenv) chirag@debian10:~/ML/Finaments$</pre><p> 那些 1 是来自print(count) ,然后它只打印来自print(points.text)的第一个&lt;p&gt;标记的内容。 我刚开始使用 beautifulsoup,请帮帮我。</p></div>

[英]How to parse all <p> tags within a certain <div> tag?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将多个 xml 文件中的属性值解析为一个 Pandas 数据框? 如何将属性值从简单的 XML 解析为 pandas 数据框? XML 查找子标签的所有属性值 如何将可能格式错误的xml解析为数据框? 使用多行属性解析 XML 输出带有单引号而不是属性值的双引号的XML 如何在数据框中组合不同的分类属性值 如何解析所有<p>特定范围内的标签</p><div>标签?</div><div id="text_translate"><p> 我正在使用 BeautifulSoup 来解析一些 html 页面。 我想在&lt;div id="commentary"&gt;链接下的&lt;p&gt;标记中获取所有文本信息,该<a href="https://i.stack.imgur.com/bKPxZ.png" rel="nofollow noreferrer">链接指向我想要获取的 html 脚本内容的图像</a></p><p>当我使用find_all获取所有&lt;p&gt;标记时,列表仅包含第一个。 我曾经按照代码来计算编号。 &lt;div&gt;下存在的&lt;p&gt;标签。 从上图中您可以清楚地看到,在突出显示的&lt;div&gt;标记中大约有 19 个&lt;p&gt;标记,但我的代码仍然打印出 1。</p><pre> content = soup.find('div', attrs={'class':'company-profile'}) points = content.find('div', attrs={'id':'commentary'}) count = 0 for point in points.find_all('p'): count = count + 1 print(count) print(points.text)</pre><p> 我不知道为什么会发生这种情况以及为什么find_all方法不会返回完整列表。 我还尝试使用points.text打印&lt;div id="commentary"&gt;标记中的所有文本,但它只打印第一个&lt;p&gt;标记的内容。</p><pre> (mlenv) chirag@debian10:~/ML/Finaments$ python main.py &lt;class 'bs4.element.Tag'&gt; State Bank of India is a Fortune 500 company. It is an Indian Multinational, Public Sector banking and financial services statutory body headquartered in Mumbai. It is the largest and oldest bank in India with over 200 years of history.# 1 1 Ratios (Q3FY21) Capital Adequacy Ratio - 14.50% Net Interest Margin - 3.34% Gross NPA - 4.77% Net NPA - 1.23% CASA Ratio - 45.15%# (mlenv) chirag@debian10:~/ML/Finaments$ ^C (mlenv) chirag@debian10:~/ML/Finaments$</pre><p> 那些 1 是来自print(count) ,然后它只打印来自print(points.text)的第一个&lt;p&gt;标记的内容。 我刚开始使用 beautifulsoup,请帮帮我。</p></div> 如何在 dataframe 中找到与另一个属性的多个值相关联的属性? 如何使用 Python 解析 XML 名称和属性(复杂)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM