Небольшая подсказка для базового анализа HTML с BSoup 4?

0

Я совершенно новичок в этом, но пытался проанализировать некоторые HTML с BeautifulSoup в течение 2 дней без каких-либо реальных, хороших результатов. Один раз мне удастся удалить весь HTML и просто сохранить текст, как я его хочу, но получить только 1 результат на всю таблицу, которую я разбору, а в другой раз я получаю все, что хочу, но просто не могу показать, что все HTML.

from bs4 import BeautifulSoup

soup = BeautifulSoup (open("PlusGrosCAVerif.htm"))


raisonsociale = soup.find('td', {'class' : 'verif_col1'})

for noms in raisonsociale:
    listenom = raisonsociale.get_text()
    print(listenom)

HTML выглядит так:

   <table id="verif_hitparade_donnees">
                    <tr id="verif_meslistes_thead">
                        <th class="verif_col1">Raison sociale</th>
                        <th class="verif_col2">CP</th>
                        <th class="verif_col3">Ville</th>
                                                    <th class="verif_col5">C.A.</th>
                    </tr>

                        <tr class="verif_result_tr_opaq2">
                            <td class="verif_col1"><a href="/societe/M-H-C-S-509553459/">M H C S</a></td>
                            <td class="verif_col2"><a href="/societe/M-H-C-S-509553459/">51200</a></td>
                            <td class="verif_col3"><a href="/societe/M-H-C-S-509553459/">EPERNAY</a></td>
                                                            <td class="verif_col5"><a href="/societe/M-H-C-S-509553459/">1 472 239 977&nbsp;&euro;</a></td>
                        </tr>

                        <tr class="verif_result_tr_opaq">
                            <td class="verif_col1"><a href="/societe/VIVESCIA-302715966/">VIVESCIA</a></td>
                            <td class="verif_col2"><a href="/societe/VIVESCIA-302715966/">51100</a></td>
                            <td class="verif_col3"><a href="/societe/VIVESCIA-302715966/">REIMS</a></td>
                                                            <td class="verif_col5"><a href="/societe/VIVESCIA-302715966/">1 277 349 946&nbsp;&euro;</a></td>
                        </tr>

                        <tr class="verif_result_tr_opaq2">
                            <td class="verif_col1"><a href="/societe/SOC-COOP-APPROVISIONNEMENT-PARIS-EST-301986154/">SOC COOP APPROVISIONNEMENT PARIS EST</a></td>
                            <td class="verif_col2"><a href="/societe/SOC-COOP-APPROVISIONNEMENT-PARIS-EST-301986154/">51520</a></td>
                            <td class="verif_col3"><a href="/societe/SOC-COOP-APPROVISIONNEMENT-PARIS-EST-301986154/">SAINT MARTIN SUR LE PRE</a></td>
                                                            <td class="verif_col5"><a href="/societe/SOC-COOP-APPROVISIONNEMENT-PARIS-EST-301986154/">1 249 176 407&nbsp;&euro;</a></td>
                        </tr>

                        <tr class="verif_result_tr_opaq">
                            <td class="verif_col1"><a href="/societe/ARCELORMITTAL-DISTRI-SOLUTIONS-FRANCE-469500961/">ARCELORMITTAL DISTRI SOLUTIONS FRANCE</a></td>
                            <td class="verif_col2"><a href="/societe/ARCELORMITTAL-DISTRI-SOLUTIONS-FRANCE-469500961/">51100</a></td>
                            <td class="verif_col3"><a href="/societe/ARCELORMITTAL-DISTRI-SOLUTIONS-FRANCE-469500961/">REIMS</a></td>
                                                            <td class="verif_col5"><a href="/societe/ARCELORMITTAL-DISTRI-SOLUTIONS-FRANCE-469500961/">586 085 818&nbsp;&euro;</a></td>
                        </tr>

                        <tr class="verif_result_tr_opaq2">
                            <td class="verif_col1"><a href="/societe/SEVEAL-757803689/">SEVEAL</a></td>
                            <td class="verif_col2"><a href="/societe/SEVEAL-757803689/">51100</a></td>
                            <td class="verif_col3"><a href="/societe/SEVEAL-757803689/">REIMS</a></td>
                                                            <td class="verif_col5"><a href="/societe/SEVEAL-757803689/">480 141 491&nbsp;&euro;</a></td>
                        </tr>

                        <tr class="verif_result_tr_opaq">
                            <td class="verif_col1"><a href="/societe/ACOLYANCE-381960491/">ACOLYANCE</a></td>
                            <td class="verif_col2"><a href="/societe/ACOLYANCE-381960491/">51100</a></td>
                            <td class="verif_col3"><a href="/societe/ACOLYANCE-381960491/">REIMS</a></td>
                                                            <td class="verif_col5"><a href="/societe/ACOLYANCE-381960491/">462 996 287&nbsp;&euro;</a></td>
                        </tr>

... и продолжается довольно долгое время.

То, что я хотел сделать, - разобрать классы td "verif_col" 1, 2, 3 и 5, чтобы я мог поместить их в CSV файл, поэтому сначала попытался получить имена (verif_col1), разделив их на любой html. С приведенным выше кодом я получаю только первое имя (MHCS), а затем сценарий останавливается.

Я пробовал findAll, но я не могу заставить его работать с методом get_text(). Я думал о findNext() и таковых, но никаких результатов.

Любые мысли для потерянного и невежественного новичка?

большое спасибо

Теги:
beautifulsoup

2 ответа

1
Лучший ответ

Вместо find, используйте find_all:

raisonsociale = soup.find_all('td', {'class' : 'verif_col1'})

И чтобы получить текст, получите text атрибут:

for noms in raisonsociale:
    print noms.text

C'est tout! Надеюсь это поможет!

  • 0
    Спасибо за ваш ответ :) Я уже пытался использовать find_all, но когда я это делаю, я получаю эту ошибку: «AttributeError: объект ResultSet не имеет атрибута get_text». Я тоже пытался поиграть с content () вместо get_text (), но не смог заставить его работать.
  • 0
    Ах, обновил мой ответ
Показать ещё 2 комментария
0

Вы можете использовать регулярное выражение для выбора каждого 1, 2, 3 и 5 имени класса и сохранения каждого в массиве, чтобы напечатать его в конце, например:

from bs4 import BeautifulSoup
import sys 
import re
import itertools as it

tds = []

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'html')

for td in soup.find_all('td', attrs={'class': re.compile(r'verif_col\d')}):
    tds.append(td.string)

for i in range(len(tds) // 4): 
    print(','.join(it.islice(tds, i*4, 4*(i+1))))

Вы можете запустить его, как:

python3 script.py xmlfile

Это дает:

M H C S,51200,EPERNAY,1 472 239 977 €
VIVESCIA,51100,REIMS,1 277 349 946 €
SOC COOP APPROVISIONNEMENT PARIS EST,51520,SAINT MARTIN SUR LE PRE,1 249 176 407 €
ARCELORMITTAL DISTRI SOLUTIONS FRANCE,51100,REIMS,586 085 818 €
SEVEAL,51100,REIMS,480 141 491 €
ACOLYANCE,51100,REIMS,462 996 287 €

Ещё вопросы

Сообщество Overcoder
Наверх
Меню