красивый суп разбирает столбцы таблицы и выводит новые строки

#python #html #beautifulsoup

Вопрос:

Я использую следующий код для циклического просмотра каждой строки и столбца таблицы html

 data = []
table = page.find('table', attrs={'class':'table table-no-border table-hover table-striped keyword_result_table'})
table_body = table.find('tbody')

rows = table_body.find_all('tr')
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele]) # Get rid of empty values
 

Этот столбец таблицы дает мне несколько

     <td class="keyword">
     <span class="is_in_saved_list" id="is_in_saved_list_81864060">
     </span>
     <a href="javascript:void(0);">
      <b>
       what
      </b>
      <b>
       is
      </b>
      <b>
       in
      </b>
      <b>
       house
      </b>
      <b>
       paint
      </b>
     </a>
    </td>
 

Результат получается в виде

[‘что такое nnn n вn nn домеn nn краска’, ‘5756’, ‘979’, ‘2’, ‘Отлично», «89», «.comn nn .netn nn .org»]

На консоли и на экране приглашения здесь, похоже, есть пробелы для вкладок, но они не отображаются в сообщении. Я попробовал .rstrip() после strip (), но без изменений. Есть ли способ захватить только текстовое содержимое, к которому прикреплена ссылка?

Ответ №1:

Вы можете использовать .stripped_strings , чтобы получить текст без пробелов/вкладок.

Вот код:

 import bs4 as bs

s = """
 <td class="keyword">
     <span class="is_in_saved_list" id="is_in_saved_list_81864060">
     </span>
     <a href="javascript:void(0);">
      <b>
       what
      </b>
      <b>
       is
      </b>
      <b>
       in
      </b>
      <b>
       house
      </b>
      <b>
       paint
      </b>
     </a>
    </td>
    """
soup = bs.BeautifulSoup(s, 'lxml')
t = soup.find('td')
print(list(t.stripped_strings))
 
 ['what', 'is', 'in', 'house', 'paint']
 

Ответ №2:

Вы пробовали удалить ‘n’ из строк?

 s = 'whatn nn isn nn inn nn housen nn paint'
s.replace('n', '')
'what  is  in  house  paint'
 

Ответ №3:

Вы можете захватить текст ссылки, используя .find('a').text напрямую. Затем простым split join удалите все пробелы и n.

 from bs4 import BeautifulSoup

html_doc = """
    <td class="keyword">
     <span class="is_in_saved_list" id="is_in_saved_list_81864060">
     </span>
     <a href="javascript:void(0);">
      <b>
       what
      </b>
      <b>
       is
      </b>
      <b>
       in
      </b>
      <b>
       house
      </b>
      <b>
       paint
      </b>
     </a>
    </td>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
link_text = soup.find('a').text

cleaned_link_text = " ".join(link_text.split())
print(cleaned_link_text)
# what is in house paint