2016-11-17 6 views
0

У меня есть HTML следующим образом:В BeautifulSoup, Игнорировать дочерние элементы Хотя Получение родительского элемента данных

<html> 
    <div class="maindiv"> 
     text data here 
     <br> 
     continued text data 
     <br> 
     <div class="somename"> 
      text & data I want to omit 
     </div> 
    </div> 
</html> 

Я пытаюсь получить только текст найден в maindiv элемента, не получая текстовые данные, найденные в somename элемент. В большинстве случаев, по моему опыту, большинство текстовых данных содержится в некотором дочернем элементе. Я столкнулся с этим конкретным случаем, однако, когда данные, кажется, содержат несколько will-nilly и немного сложнее фильтровать.

Мой подход заключается в следующем:

textdata= soup.find('div', class_='maindiv').get_text()

Это получает все текстовые данные, найденные в maindiv элемента, а также текстовые данные, найденные в элементе somename Див.

Логика, которую я хотел был бы использовать больше в строках: textdata = soup.find('div', class_='maindiv').get_text(recursive=False), который опускает любые текстовые данные, найденные в пределах somename.

Я знаю, что аргумент recursive=False работает для поиска только элементов уровня родительского уровня при поиске структуры DOM с использованием BeautifulSoup, но не может использоваться с методом .get_text().

Я понял подход к нахождению всего текста, а затем вычитал строковые данные, найденные в элементе somename, из строковых данных, найденных в элементе maindiv, но я ищу что-то более эффективное.

+0

Что делать, если есть более чем один уш? или какой-либо другой div без класса как нечто иное, чем 'somename'? – nu11p01n73R

+0

В идеале, мне нужен подход, который можно было бы адаптировать для обработки обеих ситуаций. – theeastcoastwest

ответ

2

Не так далеко от метода вычитания, но один из способов сделать это (по крайней мере, на Python 3) - это отбросить все дочерние div.

s = soup.find('div', class_='maindiv') 

for child in s.find_all("div"): 
    child.decompose() 

print(s.get_text()) 

бы напечатать что-то вроде:

text data here 

     continued text data 

Это может быть немного более эффективным и гибким, чем вычитание строк, хотя он все еще должен пройти через детей первого.

+0

Это больше касается того, что я искал, я не знал о методе '.decompose()'. Похоже, мне нужно немного почитать! Я немного проверю этот подход и посмотрю, как он работает – theeastcoastwest

+0

Да, я нашел, что из документации BS, конечно. Существуют также некоторые другие связанные функции, такие как 'extract' и' replace_with'. [Ссылка] (https://www.crummy.com/software/BeautifulSoup/bs4/doc/#decompose), если кто-то заинтересован. –

0
from bs4 import BeautifulSoup 
html =''' 
<html> 
    <div class="maindiv"> 
     text data here 
     <br> 
     continued text data 
     <br> 
     <div class="somename"> 
      text & data I want to omit 
     </div> 
    </div> 
</html>''' 
soup = BeautifulSoup(html, 'lxml') 

soup.find('div', class_="maindiv").next_element 

из:

'\n  text data here \n  ' 
Смежные вопросы