当父标记的子代具有特定属性值时,如何使用BeautifulSoup获取父标记的名称值?

一分钱

为了使这个问题更容易理解,下面是一个示例

<Tag name="Thumbnail" inline="no" nonsearchable="yes">
<Attribute>
<Attribute name="AText" Searchable="yes"></Attribute>
</Attribute>
</Tag>

<Tag name="Label" inline="no" nonsearchable="yes">
<Attribute>
<Attribute name="AText" Searchable="no"></Attribute>
</Attribute>
</Tag>

<Tag name="Image" inline="no" nonsearchable="yes">
<Attribute>
<Attribute name="BText" Searchable="yes">
</Attribute>
</Tag>

<Tag name="Wonder" inline="no" nonsearchable="yes">
<Attribute>
<Attribute name="BText" Searchable="yes"></Attribute>
</Attribute>
</Tag>

预期结果

在此处输入图片说明

因此,在excel中,如果Attribute标签的Searchable值为“ yes,则第一行应为Attribute标签的名称值然后,这些“合格”属性标签的父标签-标签-名称值将下面列出。

目前,我只能找到所有Tag的名称值,如果它们的子级Searchable值为“ yes”,但无法将其归类为相应的Attribute标记的名称值。下面是我的初始代码:

import os, openpyxl
from bs4 import BeautifulSoup

cwd = os.getcwd()

def func(x):
    for file in os.listdir(cwd):
        if file.endswith('.xml'):
            f = open(file, encoding = 'utf=8', mode = 'r+')
            soup = BeautifulSoup(f, 'lxml')
            AttrYES = soup.find_all(attrs={"Searchable": "yes"})
            for items in AttrYES:
                tagName = items.parent.parent.get('name')
                print (tagName)

x = os.listdir(cwd)
func(x)

我也会尝试解决这个问题,但是为了使过程更快,如果您有任何想法,请提出建议。谢谢!!

小小D

您的代码找不到任何内容,如果您进行打印AttrYES,它将为[]问题是,当bs4与解析器一起使用lxml,所有标记和属性名称都将转换为小写,请参阅官方文档如果您打印汤,它将为您提供:

<html><body><tag inline="no" name="Thumbnail" nonsearchable="yes">
<attribute>
<attribute name="AText" searchable="yes"></attribute>
</attribute>
</tag>
<tag inline="no" name="Label" nonsearchable="yes">
<attribute>
<attribute name="AText" searchable="no"></attribute>
</attribute>
</tag>
<tag inline="no" name="Image" nonsearchable="yes">
<attribute>
<attribute name="BText" searchable="yes">
</attribute>
</attribute></tag>
<tag inline="no" name="Wonder" nonsearchable="yes">
<attribute>
<attribute name="BText" searchable="yes"></attribute>
</attribute>
</tag></body></html>

因此,您可以这样修改代码:

import bs4
f = open('test.xml',mode = 'r+')
soup = bs4.BeautifulSoup(f, 'lxml')
AttrYES = soup.findAll(attrs={'searchable': 'yes'})
result = dict()
for items in AttrYES:
    result[items.get('name')] = result.get(items.get('name'),[])+[items.parent.parent.get('name')]    
print(result)

打印将是:

{'AText': ['Thumbnail'], 'BText': ['Image', 'Wonder']}

然后,您可以将它们写入到您的excel文件中:

import xlsxwriter

workbook = xlsxwriter.Workbook('result.xlsx')
worksheet = workbook.add_worksheet()

# Write header
worksheet.write(0, 0, result.keys()[0])
worksheet.write(0, 1, result.keys()[1])

# Write data.
worksheet.write_column(1, 0, result.values()[0])
worksheet.write_column(1, 1, result.values()[1])

workbook.close()

result.xlsx会是:

在此处输入图片说明

更新:使用openpyxl

from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
i,j = 1,1
for keys,values in a.items():
    ws.cell(column=i, row=1, value=keys)
    for row in range(len(values)):
        ws.cell(column=i, row=j+1, value=values[row])
        j+=1
    j=1
    i+=1
wb.save("result.xlsx")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用BeautifulSoup查找具有未知值属性的元素?

当样式同时具有父属性和点分名称时,继承的行为如何?

Xpath获取带有子标记的父标记

jq过滤具有特定值的对象并获取父对象的ID

查找具有特定值的子代的属性名称

如何使用XML和Java根据给定的父标记检索所有子标记?

XPath:仅当所有子节点都具有特定值时,才获取父节点的属性

SQL获取父级,其中子级具有特定值

如何使用Beautifulsoup4检查父标记是否具有名称不是“ div”的直接子代

如何使用ElementTree在xml文件中搜索具有特定值的“父”标签的标签?(蟒蛇)

Xpath问题从具有样式属性的父标记中解析子标记

如何在SQL中拆分具有相同子代名称的两个xml标记

如果所有引用父ID的子代均具有选定值,则返回父ID

XQuery:如何从标记中获取特定值?

如何使用多重继承获取某些父类属性值

如何使用HTML Agility Pack获取所有在其属性值中包含特定字符串的HTML标记?

具有不同值类型的JSP标记属性

如何使用for循环在xslt中处理具有相同名称但属性值不同的xml标记

如何从具有相同名称的XML获取特定值

当三个具有相同名称的<input>标记时,如何使用WWW :: Mechanize :: Firefox设置值?

如何通过使用xmldocument中的子节点的属性值来获取父节点的属性值?

如何获取XML父属性值

使用 Beautifulsoup 时如何获取文本标记

MongoDB:获取具有特定父 ID 和最高顺序值的单个文档

如何使用“where”获取具有XYZ属性的父级的父级

仅当父 div 具有特定属性时,如何在 Vue.js 中使用“v-if”来呈现 <span> ?

Hibernate HQL:当且仅当所有子实体都具有相同值的属性时,如何选择父实体?

如何使用 BeautifulSoup 汤.select 获取元标记值

如何使用 SQL Server 从具有特定标记值的 xml 获取对象?