Ne peut tout simplement pas résoudre cela par moi-même. Je connais assez bien BeatifulSoup mais je ne peux pas créer la chaîne pour ce qui suit: Le HTML est un extrait de la page que je souhaite supprimer (et je suis autorisé à supprimer btw):

import bs4 as BeautifulSoup
    
data= """<dl class="markt_expose_deflist markt_expose_deflist_lineless">
 <dt>
  Ort
 </dt>
 <dd>
  80995
  <a href="https://www.markt.de/suche.htm" title="München">
   München
  </a>
 </dd>
 <dt>
  Anzeigentyp
 </dt>
 <dd>
  Privatangebot
 </dd>
 <dt>
  Anzeigendatum
 </dt>
 <dd>
  04.10.2020
 </dd>
 <dt>
  Anzeigenkennung
 </dt>
 <dd>
  <a href="https://some.link/">
   blabla
  </a>
 </dd>
 <dt>
  Aufrufe dieser Anzeige
 </dt>
 <dd>
  734
 </dd>
</dl>"""
    
soup = BeautifulSoup(data, 'html.parser')

Je veux attribuer la date 04.10.2020 du html à la date variable. Ma dernière tentative était la suivante:

date = soup.find('dl',{'class':'markt_expose_deflist markt_expose_deflist_lineless'}).find('dt',{'text':'Anzeigentyp'}).find('dd').text

Mais cela n'a évidemment pas fonctionné, sinon je ne demanderais pas d'aide :)

0
stempst0r 19 oct. 2020 à 09:56

4 réponses

Meilleure réponse

La date est présente dans la troisième balise dd, utilisez simplement la méthode find_all pour trouver toutes les balises dd et attribuez simplement le texte présent dans la troisième balise dd ( qui a un index de 2) à la var date. Et votre déclaration import était également fausse. Une autre suggestion de mon côté est d'utiliser html5lib au lieu de html.parser. Voici le code final:

from bs4 import BeautifulSoup

data= """    <dl class="markt_expose_deflist markt_expose_deflist_lineless">
        <dt>
          Ort
        </dt>
        <dd>
          80993&nbsp;<a href="https://www.markt.de/suche.htm" title="München">München</a>
        </dd>
      <dt>
        Anzeigentyp
      </dt>
      <dd>
        Privatangebot
      </dd>
        <dt>
          Anzeigendatum
        </dt>
        <dd>
          04.10.2020
        </dd>
        <dt>
          Anzeigenkennung
        </dt>
        <dd>
          <a href="https://some.link/">f2e7ae76</a>
        </dd>
        <dt>
          Aufrufe dieser Anzeige
        </dt>
        <dd>
          689
        </dd>
    </dl>"""

soup = BeautifulSoup(data, 'html5lib')

date = soup.find('dl',{'class':'markt_expose_deflist markt_expose_deflist_lineless'})

date = date.find_all('dd')[2].text.strip()

print(date)

Production:

04.10.2020
1
Sushil 19 oct. 2020 à 07:07

Donc, tout d'abord, votre déclaration import est fausse. Ce que vous faites, c'est simplement renommer bs4 en BeautifulSoup. Ce que je pense que vous vouliez faire était d'importer BeautifulSoup depuis le module bs4.

Pour faire cela en python, nous faisons:

from module import the_class_you_want_to_import

Donc dans votre cas ce serait:

from bs4 import BeautifulSoup

Maintenant que l'importation est triée, passons au code réel.

L'élément <dt> que vous essayez de trouver n'a pas d'élément enfant et nous ne pouvons donc trouver aucun élément <dd> à l'intérieur.

Ce que j'ai fait à la place était ceci:

soup = BeautifulSoup(data, 'html.parser')
date = soup.findAll('dd')
print(date[2].text.strip())
0
Matej Novosad 19 oct. 2020 à 07:38

Vous pouvez sélectionner la balise voisine de <dt> qui contient la chaîne "Anzeigendatum":

print( soup.select_one('dt:contains("Anzeigendatum") + dd').text )

Tirages:

  04.10.2020
0
Andrej Kesely 19 oct. 2020 à 11:35

Vous pouvez l'utiliser si toutes les dates sont au même format. Il extrait simplement toutes les balises dd et vérifie le texte à l'intérieur avec une condition pour savoir si elles ont plus d'un ".".

soup = BeautifulSoup(data, 'html.parser')


for tag in soup.find_all('dd'):
    if tag.text.count('.') > 1:
        date = tag.text.lstrip()
        print(date)

Production:

04.10.2020
0
mulaixi 19 oct. 2020 à 07:33