使用BeautifulSoup解析XML:提取href并标记主parent标签结尾
提取XML中
herf属性值并在每个parent标签结束时添加分隔符 首先得提个细节:你提供的XML里子标签的属性是herf(不是标准的href),这一点在代码里必须对应上,不然会提取不到任何内容。另外你的现有代码只是打印了匹配到的标签对象,既没提取属性值,也没处理分隔符的需求。
下面是修正后的代码,完美实现你要的效果:
from bs4 import BeautifulSoup # 先把你的XML内容整理成更易解析的格式 xml_content = """ <root> <parent id1='1111'> <child herf='xxx'/> <child herf ='yyyy'/> </parent> <parent id1='22222'> <child herf='zzzz'/> <child herf ='tttt'/> </parent> <parent id1='33333'> <child herf='wwww'/> <child herf ='qqqqq'/> <parent id1='4444'> <child herf='ssss'/> <child herf ='uuuu'/> </parent> <parent id1='55555'> <child herf='oooo'/> <child herf ='pppp'/> </parent> </parent> <parent id1='6666'> <child herf='mmmm'/> <child herf ='nnnnn'/> </parent> </root> """ soup = BeautifulSoup(xml_content, "xml") # 递归遍历所有parent标签(包括嵌套的子parent) def process_parent(parent): # 提取当前parent下所有child的herf值,用空格拼接 href_str = ' '.join([child.get('herf') for child in parent.find_all('child')]) # 输出值和分隔符 print(f"{href_str} ----- ", end='') # 处理当前parent内部的子parent for sub_parent in parent.find_all('parent', recursive=False): process_parent(sub_parent) # 启动处理root下的所有顶层parent for top_parent in soup.root.find_all('parent', recursive=False): process_parent(top_parent)
代码说明:
- 用递归函数
process_parent处理每个parent标签,不管它是顶层还是嵌套的子parent - 先提取当前
parent下所有child的herf值,用空格拼接成字符串 - 输出拼接后的内容,紧接着输出
-----分隔符 - 递归处理当前
parent内部的子parent,确保所有层级的parent都被覆盖
运行这段代码后,输出会和你期望的格式一致:
xxx yyyy ----- zzzz tttt ----- wwww qqqqq ----- ssss uuuu ----- oooo pppp ----- mmmm nnnnn -----
如果你的需求是只处理顶层parent,忽略嵌套的子parent,可以去掉递归逻辑,简化成这样:
from bs4 import BeautifulSoup soup = BeautifulSoup(xml_content, "xml") for top_parent in soup.root.find_all('parent', recursive=False): href_str = ' '.join([child.get('herf') for child in top_parent.find_all('child')]) print(f"{href_str} ----- ", end='')
这段代码的输出会是:
xxx yyyy ----- zzzz tttt ----- wwww qqqqq ----- mmmm nnnnn -----
你可以根据实际需求选择对应的版本~
内容的提问来源于stack exchange,提问作者Sabby
相关产品推荐
相关产品推荐

