C'est la première fois que j'utilise BeautifulSoup et j'essaye d'analyser un tableau HTML. Jusqu'à présent, grâce à d'autres exemples, j'ai pu écrire du code simple pour être très proche de ce dont j'ai besoin. Cependant, en utilisant le ele.text.strip(), je finis par perdre une partie des informations que je souhaite conserver.

Comme vu ci-dessous, voici à quoi ressemble mon code maintenant:

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

table = soup.find("div", id="CT_Main_1_divResults")
table_body = table.find('tbody')
rows = table_body.find_all('tr')

data = []
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append(cols)

Résultats:

[u'$4,090,000,000',
 u'13.61%',
 u'4,550,000',
 u'100 Grainger Pkwy.',
 u'',
 u'',
 u'']

J'ai pensé que je pourrais peut-être éliminer la ligne ele.text.strip() et utiliser le même code, comme indiqué ci-dessous:

data = []
for row in rows:
    cols = row.find_all('td')
    data.append(cols)

Voici les résultats fournis ci-dessous:

[<td><span style="text-align: right; height: 36px;">$4,090,000,000</span></td>,
 <td><span style="text-align: right; height: 36px;">13.61%</span></td>,
 <td><span style="text-align: right; height: 36px;">4,550,000</span></td>,
 <td class=""><span style="text-align: right; height: 36px;">100 Grainger Pkwy.</span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/cancel.gif"/></span></td>,
 <td class="tdbrdrright"><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>]

Une façon de contourner cela pourrait être d'utiliser la deuxième option et de faire une analyse de chaîne sophistiquée pour saisir ce dont j'ai besoin, mais j'espère qu'il existe une meilleure solution. En fin de compte, je veux que les données ressemblent à celles ci-dessous. Comment puis-je ajuster mon code pour y parvenir?

[u'$4,090,000,000',
 u'13.61%',
 u'4,550,000',
 u'100 Grainger Pkwy.',
 u'Inside%20the%20Databases.com_files/True.gif',
 u'Inside%20the%20Databases.com_files/calcel.gif',
 u'Inside%20the%20Databases.com_files/True.gif']
0
CurtLH 17 janv. 2017 à 08:57

2 réponses

Meilleure réponse
import bs4

html = '''<td><span style="text-align: right; height: 36px;">$4,090,000,000</span></td>,
 <td><span style="text-align: right; height: 36px;">13.61%</span></td>,
 <td><span style="text-align: right; height: 36px;">4,550,000</span></td>,
 <td class=""><span style="text-align: right; height: 36px;">100 Grainger Pkwy.</span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/cancel.gif"/></span></td>,
 <td class="tdbrdrright"><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>'''
soup = bs4.BeautifulSoup(html, 'lxml')

for td in soup('td'):
    if td.text:
        print(td.text)
    else:
        print(td.img.get('src'))

En dehors:

$4,090,000,000
13.61%
4,550,000
100 Grainger Pkwy.
Inside%20the%20Databases.com_files/True.gif
Inside%20the%20Databases.com_files/cancel.gif
Inside%20the%20Databases.com_files/True.gif

Remplacez print par append, et vous obtiendrez une liste de cette sortie.

Les informations manquantes que vous souhaitez se trouvent dans l'attribut de la balise img, pas dans un texte.

3
宏杰李 17 janv. 2017 à 06:07

Essayez ceci. Vous devrez ajuster en fonction de ce que vous voulez faire s'il y a, par exemple, plusieurs balises img, ou du texte ainsi que des balises img, etc., mais cela devrait vous aider à démarrer bon chemin.

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("data-table.html"), 'html.parser')

table = soup.find("div", id="CT_Main_1_divResults")
table_body = table.find('tbody')
rows = table_body.find_all('tr')

data = []
for row in rows:
    cols = []
    for col in row.find_all('td'):
        t = col.text.strip()
        if not t:
            for img in row.find_all('img'):
                t = img.attrs['src']

        cols.append(t)
    data.append(cols)

print(data)

Production:

[[u'$4,090,000,000', u'13.61%', u'4,550,000', u'100 Grainger Pkwy.', u'Inside%20the%20Databases.com_files/True.gif', u'Inside%20the%20Databases.com_files/True.gif', u'Inside%20the%20Databases.com_files/True.gif']]
1
Scovetta 17 janv. 2017 à 06:06