2016-06-27 3 views
2

Я выскабливание HTML данные, похожее на следующее:Исключить метки в зависимости от содержания в BeautifulSoup

<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>?

Из Примечания: после получения набора результатов от soup.find('div', class_='target-content')find_all('p'), я итеративно добавляя каждый <p> из результирующего набора в список следующим образом:

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

ответ

3

Вы можете просто пропустить 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"). div.target-content > p является CSS selector, который будет соответствовать всем p тегам, которые являются прямыми детьми div элемент с target-content класс.

+0

Спасибо, это было именно то, что я пытаюсь понять. Благодарим вас за объяснение; Я не думаю, что использовать селектор CSS так часто, как я должен с Beautifulsoup. – theeastcoastwest

2

Вы можете использовать filter для достижения этой цели:

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

Спасибо за помощь, я закончил тем, что использовал вариацию ответа @alexce выше, хотя вы также оказались полезными. – theeastcoastwest

Смежные вопросы