【问题标题】:How to specify child tags with findall using beautifulsoup python如何使用 beautifulsoup python 用 findall 指定子标签
【发布时间】:2016-11-07 18:33:21
【问题描述】:

如何仅获取其他标签旁边的特定标签。所以如果我这样做了

soup.findAll('blockquote') 我将获得所有块引用的列表,但我只想要块引用,它也位于名称为 attr 的标记旁边。 <a name="*">

所以我的块引用列表不会包含这样的内容:

   <blockquote>
     <i>Intro </i>
  </blockquote>

当我想要的时候

<blockquote><a name="*">  </blockquote>

下面是示例,但还有一些其他的块引用,带有其他内部标记。但我只想要带有&lt;a name="*"&gt; 内部标签的那些。

<blockquote>
<i>Intro </i>
</blockquote>, <blockquote>
<a name="1">a </a><br>
</br></blockquote>, <blockquote>
<a name="2">x </a><br>
<a name="3">y </a><br>
<a name="4">z </a><br>
</br></br></br></blockquote>

好吧,或者我想要得到这样的结果

<blockquote>
    <a name="1">a </a><br>
    </br></blockquote>, <blockquote>
    <a name="2">x </a><br>
    <a name="3">y </a><br>
    <a name="4">z </a><br>
    </br></br></br></blockquote>

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    或者,您可以通过searching function 一次性完成

    soup.find_all(lambda tag: tag.name == "blockquote" and tag.a)
    

    其中tag.a 等价于tag.find("a")

    换句话说,这将找到所有具有a 子元素的blockquote 元素。

    【讨论】:

      【解决方案2】:

      如何获取所有a 标记,它们是blockquote 标记的直接子标记,然后获取它们的父标记(块引用)?

      from bs4 import BeautifulSoup
      
      soup = BeautifulSoup("""
      <blockquote>
      <i>Intro </i>
      </blockquote>, <blockquote>
      <a name="1">a </a><br>
      </br></blockquote>, <blockquote>
      <a name="2">x </a><br>
      <a name="3">y </a><br>
      <a name="4">z </a><br>
      </br></br></br></blockquote>
      """, 'html.parser')
      
      for a in soup.select('blockquote > a'):
          print(a.parent)
      

      结果:

      <blockquote>
      <a name="1">a </a><br>
      </br></blockquote>
      <blockquote>
      <a name="2">x </a><br>
      <a name="3">y </a><br>
      <a name="4">z </a><br>
      </br></br></br></blockquote>
      

      【讨论】: