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
3 Réponses :
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&seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&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]))
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&seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&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>
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:
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&seapos=result%3A1%3AJeff%20S%20Swangim%2C%20PGA&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))
@SIM Merci. Je suis toujours aux prises avec tout cela. +