0
votes

HTML Python obtenant l'ID div par texte

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>


2 commentaires

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.


3 Réponses :


1
votes

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'))


3 commentaires

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.



1
votes

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'])


1 commentaires

Bonne réponse, je viens de recevoir Maaz en premier.



0
votes

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']


0 commentaires