2
votes

Comment trouver la balise P qui n'a pas de frères et sœurs en utilisant Beautiful soupe

Certaines balises

ont une balise et une balise

, mais je ne veux que celles

balise qui n'a pas de balises frères et sœurs, juste le contenu.

 <p> <img src="any url"/> </p>     <p> hello world </p>

Je veux une balise

qui n'a pas de Balise utilisant une belle soupe


3 commentaires

pouvez-vous nous donner un exemple ... ou l'URL pour que nous comprenions ce que vous voulez dire ??


Quelle est la hiérarchie html? Ce serait mieux si vous pouviez modifier et ajouter les balises.


@ K163897 Muhammad Nafees est-ce que l'une des réponses ci-dessous a aidé à résoudre votre problème? Si oui, vous pouvez marquer celui que vous souhaitez, merci!


4 Réponses :


-1
votes
from bs4 import BeautifulSoup

txt = """
<p> <img src="any url"/> </p>     <p> hello world </p>
"""

soup = BeautifulSoup(txt)

for node in soup.findAll('p'):
    print(' '.join(node.findAll(text=True, recursive = False)))
OUTPUT:
  hello world

0 commentaires

0
votes

Cela obtiendra tout le texte des éléments

mais ne l'obtiendra d'aucun des éléments enfants dans le

. Récursif doit être égal à false sinon il examinera les éléments enfants. J'ai ajouté dans un autre cas de test pour vous montrer ceci:

Heading

from bs4 import BeautifulSoup

html = "<p> <img src='any url'/> </p>   <p><h4>Heading</h4></p>  <p> hello world </p>"

soup = BeautifulSoup(html)

for element in soup.findAll('p'):
    print("".join(element.findAll(text=True, recursive=False)))


0 commentaires

0
votes

Une solution pour obtenir toutes les balises p sans balises enfants.

[<p> hello world </p>]

Sortie

import bs4
html="""<p> <img src="any url"/> </p>     <p> hello world </p>"""
soup=bs4.BeautifulSoup(html,"html.parser")

def has_no_tag_children(tag):
    if  type(tag) is bs4.element.Tag: #check if tag
        if tag.name =='p': #check if it is p tag
            if  bs4.element.Tag not in [type(child) for child in tag.children]: # check if has any tag children
                return True
    return False

kids=soup.find_all(has_no_tag_children)
print(kids)


0 commentaires

0
votes

En supposant que BeautifulSoup 4.7+, vous devriez pouvoir faire ceci:

import bs4
html="""<p> <img src="any url"/> </p>     <p> hello world </p>"""
soup=bs4.BeautifulSoup(html,"html.parser")

kids=soup.select("p:not(:has(*))")
print(kids)


0 commentaires