我对此非常陌生,但是一直试图用BeautifulSoup解析一些HTML 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 €</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 €</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 €</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 €</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 €</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 €</a></td>
</tr>
......并且持续了很长一段时间。
我想要做的是解析td类“verif_col”1,2,3和5,所以我可以将它们放在CSV文件中,所以我首先尝试获取名称(verif_col1),将它们删除html周围。使用上面的代码,我只得到第一个名字(MHCS),然后脚本停止。
我尝试过findAll,但我无法使用get_text()方法。我已经考虑过findNext()等等,但没有结果。
对于一个迷失无知的新手的任何想法?
非常感谢
答案 0 :(得分:1)
而不是find
,请使用find_all
:
raisonsociale = soup.find_all('td', {'class' : 'verif_col1'})
要获得文字,请获取text
属性:
for noms in raisonsociale:
print noms.text
C'est呐喊!希望这有帮助!
答案 1 :(得分: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 €