基于Beautifulsoup中的内容排除标签

时间:2016-06-27 15:50:09

标签: python web-scraping beautifulsoup

我正在抓取类似于以下内容的html数据:

<div class="target-content">
    <p id="random1">
      "the content of the p"
    </p>

    <p id="random2">
      "the content of the p"
    </p>

    <p>
      <q class="semi-predictable">
         "q tag content that I don't want
      </q>
    </p>

    <p id="random3">
      "the content of the p"
    </p>

</div>

我的目标是获取所有<p>代码及其内容,同时能够排除<q>代码及其内容。目前,我使用以下方法获取所有<p>标记:

contentlist = soup.find('div', class_='target-content').find_all('p')

我的问题是,在找到所有<p>代码的结果集后,如何过滤掉包含{{<p>的单个<q>及其内容1}}?

注意:从soup.find('div', class_='target-content')find_all('p')获取结果集后,我按以下方式迭代地将结果集中的每个<p>添加到列表中:

content = ''
    for p in contentlist:
        content += str(p)

2 个答案:

答案 0 :(得分:3)

您可以跳过内置bar()标记的p代码:

q

其中for p in soup.select('div.target-content > p'): if p.q: # if q is present - skip continue print(p) p.q的快捷方式。 p.find("q")是一个CSS selector,它会匹配div.target-content > pp元素的直接子元素与div类的所有target-content个标记。

答案 1 :(得分:2)

您可以使用filter来完成此任务:

filter(lambda e: e.find('q') == None, soup.find('div', class_='target-content').find_all('p'))