Python - BeautifulSoup 按属性查找父级

Python - BeautifulSoup findParent by attribute

我希望使用 BeautifulSoup 中的 findParent() 方法来查找具有 id 属性的特定标签的父级。例如,考虑以下示例 XML:

<monograph>
    <section id="1234">
        <head>Test Heading</head>
        <p>Here's a paragraph with some text in it.</p>
    </section>
</monograph>

假设我已经匹配了段落中的某些内容,我想使用 findParent 不加区别地找到具有 id 属性的树中的第一个父项。类似于:

 for hit in monograph(text="paragraph with"):
     containername = hit.findParent(re.compile([A-Za-z]+), {id}).name

但是,前面的代码 return 没有任何命中。

使用 id=True 匹配具有 id 属性的元素,而不考虑属性的值:

hit.find_parent(id=True)

相反,使用 id=False 会找到第一个父元素 没有 id 属性。

请注意,对于 BeautifulSoup 方法,您应该真正使用 lower_case_with_underscores 样式; findParent 是 BeautifulSoup 3 的拼写 has been deprecated.

演示:

>>> from bs4 import BeautifulSoup
>>> sample = '''\
... <monograph>
...     <section id="1234">
...         <head>Test Heading</head>
...         <p>Here's a paragraph with some text in it.</p>
...     </section>
... </monograph>
... '''
>>> soup = BeautifulSoup(sample, 'xml')
>>> str(soup.p)
"<p>Here's a paragraph with some text in it.</p>"
>>> print(soup.p.find_parent(id=True).prettify())
<section id="1234">
 <head>
  Test Heading
 </head>
 <p>
  Here's a paragraph with some text in it.
 </p>
</section>

>>> print(soup.p.find_parent(id=False).prettify())
<monograph>
 <section id="1234">
  <head>
   Test Heading
  </head>
  <p>
   Here's a paragraph with some text in it.
  </p>
 </section>
</monograph>