【问题标题】:Find all <a>, children of a certain <div>查找所有 <a>,某个 <div> 的孩子
【发布时间】:2016-02-23 10:40:17
【问题描述】:

我想在 &lt;h2&gt; 中包含的所有 &lt;a href=...&gt; 中循环使用 BeautifulSoup,它们本身在 &lt;div class="myclass"&gt; 中:

<a href="www.example.com">Not selected</a> 
<div class="myclass">
  <a href="www.example.com">Not selected</a> 
  <h2>
    <a href="www.example.com">SELECTED!</a> 
  </h2>
</div>

我正在考虑这样的事情,但我可以想象 BeautifulSoup 可以在没有任何if link.parent == ... 测试的情况下进行这样的过滤:

from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen(req), "lxml")

for link in soup.select('a[href]'):
    if link.parent == ...   # tests
       print link

如何用 BeautifulSoup 做到这一点?

【问题讨论】:

    标签: python parsing beautifulsoup


    【解决方案1】:

    您可以通过 findAll 一步一步地前进到您想要的 as:

    for div in soup.findAll("div", attrs={"class": "myclass"}):
        for h2 in div.findAll("h2"):
            for a in h2.findAll("a"):
                print a
    

    或者你可以在select中使用一个css选择器:

    soup.select('.myclass h2 a')
    

    【讨论】:

      【解决方案2】:

      美汤支持CSS类选择器,relevant documentation

      因此您可以按照以下方式进行查询:

      soup.find_all('.myclass > h2 > a')
      

      这就是标题的子元素的所有锚标记,它们是 div 的子元素。

      【讨论】:

        【解决方案3】:

        使用css选择器:

        soup.select('div h2 a')
        

        【讨论】:

        • 这行得通。这和soup.find_all('.myclass &gt; h2 &gt; a') 有什么区别(在我的情况下不起作用)?
        • 如果您在单个
          中有多个同名类,例如:
          然后您将使用 find_all() 搜索每个 class-demo。
        【解决方案4】:

        你可以这样做

        divs = soup.findAll('div', {'class': 'myclass'})
        for div in divs:
            links = div.findAll('h2 > a')
            for link in links:
                print link
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多