J'ai une demande un peu inhabituelle; Je souhaite obtenir l'identifiant d'un div en fonction du texte sous lequel il apparaît sur la page Web. Par exemple, disons que j'ai le html suivant:
<div class="productTabRightCompatibility"> <h2> Product Downloads </h2> <ul class="listColumn"> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_0"> </div> <a href="/-/dummy_link_one_technical_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_0" target="_blank"> ProductOne Technical Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_1"> </div> <a href="/-/dummy_link_two_cad_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_1" target="_blank"> ProductOne CAD Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_2"> </div> <a href="/-/dummy_link_three_installation_manual" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_2" target="_blank"> ProductOne Installation Manual </a> </li> </ul> </div>
Malheureusement, le site Web ne les a pas toujours dans le même ordre, donc parfois le dessin technique est représenté par l'id ResourceLink_0, et parfois le Le dessin CAO est. La seule constante est que l'élément que je souhaite est représenté par le texte "[Produit #] Dessin technique". Je souhaite pouvoir parcourir plusieurs pages et obtenir le lien qui correspond au dessin technique quelle que soit la commande. Pour le moment, je parcoure tous les liens et cherche celui qui contient "dessin_technique" quelque part dans l'adresse du lien, mais je me demande s'il existe un meilleur moyen d'obtenir le résultat.
p>
3 Réponses :
En utilisant les packages BeautifulSoup
et re
, vous devriez pouvoir faire quelque chose comme ceci:
/-/dummy_link_one_technical_drawing
OUTPUT:
from bs4 import BeautifulSoup import re html = """<div class="productTabRightCompatibility"> <h2> Product Downloads </h2> <ul class="listColumn"> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_0"> </div> <a href="/-/dummy_link_one_technical_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_0" target="_blank"> ProductOne Technical Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_1"> </div> <a href="/-/dummy_link_two_cad_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_1" target="_blank">ProductOne CAD Drawing</a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_2"> </div> <a href="/-/dummy_link_three_installation_manual" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_2" target="_blank"> ProductOne Installation Manual </a> </li> </ul> </div>""" soup = BeautifulSoup(html,'html.parser') a_link = soup.find('a', text=re.compile("ProductOne Technical Drawing")) print(a_link.get('href'))
Pourquoi avez-vous copié ma réponse?
1. Veuillez noter que ma modification a été rédigée une minute avant votre réponse 2. Assurez-vous que j'ai beaucoup de choses à faire avant de "copier les réponses SO" Vous êtes les bienvenus
J'ai vu ce que vous avez posté plus tôt, d'accord, ne soyez pas trop intelligent.
En utilisant re
, vous pouvez rechercher le texte de la balise, puis obtenir la valeur href
de cette balise.
J'ai utilisé find_all
ici au cas où vous auriez plus d'un élément présent sur la page.
/-/dummy_link_one_technical_drawing
Sortie :
import bs4 import re html_doc='''<html><div class="productTabRightCompatibility"> <h2> Product Downloads </h2> <ul class="listColumn"> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_0"> </div> <a href="/-/dummy_link_one_technical_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_0" target="_blank"> ProductOne Technical Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_1"> </div> <a href="/-/dummy_link_two_cad_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_1" target="_blank"> ProductOne CAD Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_2"> </div> <a href="/-/dummy_link_three_installation_manual" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_2" target="_blank"> ProductOne Installation Manual </a> </li> </ul> </div></html>''' soup =bs4.BeautifulSoup(html_doc, 'html.parser') items=soup.find_all('a' , text=re.compile("Technical Drawing")) for item in items: print(item['href'])
Bonne réponse, je viens de recevoir Maaz en premier.
vous pouvez éviter d'utiliser find et regex et utiliser un sélecteur d'attribut = valeur css plus rapide avec des extrémités par $ operator
from bs4 import BeautifulSoup as bs html='''<html><div class="productTabRightCompatibility"> <h2> Product Downloads </h2> <ul class="listColumn"> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_0"> </div> <a href="/-/dummy_link_one_technical_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_0" target="_blank"> ProductOne Technical Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_1"> </div> <a href="/-/dummy_link_two_cad_drawing" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_1" target="_blank"> ProductOne CAD Drawing </a> </li> <li> <div class="iconSprite icon16 iconDownloads" id="layoutmain_1_ProductTabs1_rptResources_divResourceImage_2"> </div> <a href="/-/dummy_link_three_installation_manual" id="layoutmain_1_ProductTabs1_rptResources_hlResourceLink_2" target="_blank"> ProductOne Installation Manual </a> </li> </ul> </div></html>''' soup =bs(html, 'lxml') link =soup.select_one("[href$='technical_drawing']")['href'] print(link)
Code:
[href$='technical_drawing']
Comment souhaitez-vous vous améliorer par rapport à votre solution précédente? Il semble faire ce que vous voulez.
@ Mr.Yellow Je me demande simplement s'il existe un moyen de trouver un lien basé sur le texte qu'il montre sur la page plutôt que d'itérer à travers tous les liens. Si la façon dont je le fais est la plus efficace, c'est bien, essayez simplement de faire en sorte que les choses restent aussi pythoniques que possible.