1
votes

Impossible d'extraire une partie spécifique du texte de certains éléments html

J'ai créé un script en python pour analyser l'adresse de certains éléments html. Lorsque j'exécute mon script, j'obtiens le numéro de titre , adresse et téléphone à partir des éléments alors que mon intention est d'obtenir uniquement le adresse . Si j'utilisais next_sibling , je ne pourrais obtenir que la première partie de l'adresse séparée par la balise br et c'est pourquoi j'ai ignoré cette approche.

Comment puis-je obtenir uniquement l'adresse et rien d'autre du ci-dessous l'extrait de code?

4366 W Club BlvdLake Toxaway, NC  28747-8538

Ce que j'obtiens en ce moment:

Lake Toxaway Country Club4366 W Club BlvdLake Toxaway, NC  28747-8538(828) 966-4661

Ma sortie attendue:

XXX


0 commentaires

3 Réponses :


0
votes

il y a peut-être une manière plus élégante, mais vous avez raison de chercher à utiliser .next_sibling

print (' '.join([addr, state_zip]))
4366 W Club Blvd Lake Toxaway, NC  28747-8538

Sortie:

from bs4 import BeautifulSoup

htmldoc = """
<div class="search-article-title-description">
    <div class="search-article-title">
      <a href="https://www.pga.com/pgapro/info/999918438?atrack=pgapro%3Anone&amp;seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&amp;page=1">Jeff S Swangim, PGA</a>
      <div class="search-article-protitle">
        Assistant Professional
      </div>
    </div>
    <div class="search-article-address">
      <div class="search-instructor-course">
        Lake Toxaway Country Club
      </div>
      4366 W Club Blvd<br>Lake Toxaway, NC  28747-8538<br> 
      <div class="spotlightphone_num">
        (828) 966-4661
      </div>
    </div>
</div>
"""

soup = BeautifulSoup(htmldoc,"html.parser")

addr = soup.find('div', {'class':'search-instructor-course'}).next_sibling.strip()
state_zip = soup.find('div', {'class':'search-instructor-course'}).next_sibling.next_sibling.next_sibling.strip()


print (' '.join([addr, state_zip]))


0 commentaires

2
votes

Le moyen le plus simple auquel je puisse penser est d'utiliser la fonction .extract () pour supprimer la partie qui ne vous intéresse pas. Si nous pouvons ignorer le contenu de cette classe, search-instructor -course et spotlightphone_num alors la partie restante est celle souhaitée.

Le script suivant devrait nous donner l'adresse:

from bs4 import BeautifulSoup

htmldoc = """
<div class="search-article-title-description">
    <div class="search-article-title">
      <a href="https://www.pga.com/pgapro/info/999918438?atrack=pgapro%3Anone&amp;seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&amp;page=1">Jeff S Swangim, PGA</a>
      <div class="search-article-protitle">
        Assistant Professional
      </div>
    </div>
    <div class="search-article-address">
      <div class="search-instructor-course">
        Lake Toxaway Country Club
      </div>
      4366 W Club Blvd<br>Lake Toxaway, NC  28747-8538<br> 
      <div class="spotlightphone_num">
        (828) 966-4661
      </div>
    </div>
</div>
"""
soup = BeautifulSoup(htmldoc,"lxml")
[item.extract() for item in soup.find_all(class_=["search-instructor-course","spotlightphone_num"])]
address = soup.select_one(".search-article-address").get_text(strip=True)
print(address)

p>


0 commentaires

1
votes

Vous utilisez ici l'expression xpath et lxml. Vous pouvez toujours lui transmettre votre contenu HTML.

print(' '.join(tree.xpath("//div[@class='search-article-address']/text()")))

Résultat:

 entrez la description de l'image ici

Ou , plus simplement, grâce à @SIM, il suffit de:

from lxml import html

h = '''
<div class="search-article-title-description">
    <div class="search-article-title">
      <a href="https://www.pga.com/pgapro/info/999918438?atrack=pgapro%3Anone&amp;seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&amp;page=1">Jeff S Swangim, PGA</a>
      <div class="search-article-protitle">
        Assistant Professional
      </div>
    </div>
    <div class="search-article-address">
      <div class="search-instructor-course">
        Lake Toxaway Country Club
      </div>
      4366 W Club Blvd<br>Lake Toxaway, NC  28747-8538<br> 
      <div class="spotlightphone_num">
        (828) 966-4661
      </div>
    </div>
</div>

'''

tree = html.fromstring(h)
links = [link.strip() for link in tree.xpath("//div[@class='search-article-address']/br/preceding-sibling::text()[1]")]
print(' '.join(links))


1 commentaires

@SIM Merci. Je suis toujours aux prises avec tout cela. +