使用 BeautifulSoup 在 Python 中查找非递归 DOM 子节点

Posted

技术标签:

【中文标题】使用 BeautifulSoup 在 Python 中查找非递归 DOM 子节点【英文标题】:Finding a nonrecursive DOM subnode in Python using BeautifulSoup 【发布时间】:2014-02-04 12:40:06 【问题描述】:

有没有办法在 Python 中使用 BeautifulSoup 找到非递归 DOM 子节点?

例如考虑解析pom.xml 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <parent>
        <groupId>com.parent</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <modelVersion>2.0.0</modelVersion>
    <groupId>com.parent.somemodule</groupId>
    <artifactId>some_module</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Some Module</name>
    ...

如果我想在顶层获得groupId(特别是project-&gt;groupId,而不是project-&gt;parent-&gt;groupId),我使用:

with open(pom) as pomHandle:
    soup = BeautifulSoup(pomHandle)

groupId = soup.groupid.text

但不幸的是,无论层次结构级别如何,它都会在文件中找到groupId 的第一个物理匹配项,即project-&gt;parent-&gt;groupId。我实际上只想在特定节点级别而不是在其子节点中进行非递归查找。有没有办法在BeautifulSoup 中做到这一点?

【问题讨论】:

为什么要使用 BeautifulSoup(一个 html 解析器)来解析格式良好的 XML? Python 有一个非常好的 XML 解析器。 这就是为什么:***.com/questions/21146417/… 因为我不想处理命名空间 BS,这显然是不可忽视的 【参考方案1】:

您可以使用recursive=False 在“项目”节点内搜索:

groupId = soup.project.find('groupid', recursive=False).text

希望对您有所帮助。

【讨论】:

你是我今天的人物,@alecxe

以上是关于使用 BeautifulSoup 在 Python 中查找非递归 DOM 子节点的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 BeautifulSoup 从脚本标签中提取文本

无法在python中导入beautifulsoup

在 Python 中使用 BeautifulSoup 解析数据

[Python]BeautifulSoup安装与使用

Python使用BeautifulSoup爬取网页信息

Python:使用 BeautifulSoup 库抓取百度天气