Как отфильтровать узлы HTML, содержащие текст, со страницы HTML - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в изучении веб-страниц и получил проблему

Я использую BeautifulSoup для очистки веб-страницы. Я хочу получить узлы, в которых есть текст.

Я пробовал это с помощью метода get_text (), как этот

  soup = BeautifulSoup(open('FAQ3.html'), "html.parser")                               
  body = soup.find('body')                                                                                                                  
  for i in body:                                                                       
    if type(i) != bs4.element.Comment and type(i)!= bs4.element.NavigableString :     
      if i.get_text():                                                             
        print(i)                                                                   

но get_text дает узел, даже если его дочерний элемент содержит текст,

образец HTML:

<div>
  <div id="header">
        <script src="./FAQ3_files/header-home.js"></script>
  </div>
  <div>
   <div>
      this node contain text
    </div>
 </div>
</div>

при проверке самого верхнего div он возвращает весь узел, так как в самом внутреннем содержался текст,

как перебрать все узлы и отфильтровать только те узлы, в которых есть текст?

1 Ответ

0 голосов
/ 17 сентября 2018

Я использовал поиск в глубину для этого, это решило мой вариант использования

def get_text_bs4(self, soup, leaf):
        if soup.name is not None:
            if soup.string != None and soup.name != 'script': 
                    if soup.text not in leaf:
                        leaf[soup.text] = soup
            for child in soup.children:
                self.get_text_bs4(child, leaf)
        return leaf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...