2
votes

Obtenir le contenu d'une ligne particulière

Je veux localiser 'td' où le texte est 'xyz' afin de pouvoir trouver d'autres attributs dans la ligne. Je n'ai que «xyz» avec moi et je souhaite obtenir d'autres éléments dans cette ligne.

xyz
address
phone number

Je peux facilement obtenir «xyz» en utilisant

required = soup.find('a', text = 'xyz')
print(required[0].text)

mais je ne parviens pas à localiser 'td' pour pouvoir utiliser find_next_siblings () pour obtenir d'autres colonnes.

Résultat attendu:

.
.
.

<tr>
    <td>
        <a>xyz</a>
    </td>
    <td>address</td>
    <td>phone number</td>
</tr>

.
.
.


2 commentaires

définir l'ID pour la balise html


@Internship TY utilise le sélénium avec find_elements_by_css_selector: selenium-python.readthedocs.io/locating-elements. html


4 Réponses :


0
votes

Remplacez votre code par:

xyz
address
phone number

O / P:

from bs4 import BeautifulSoup

html = '''<tr>
    <td>
        <a>xyz</a>
    </td>
    <td>address</td>
    <td>phone number</td>
</tr>'''

soup = BeautifulSoup(html, 'lxml')
required = soup.find('a', text = 'xyz')
print(required.text)
td = required.parent
siblingsArray = td.find_next_siblings()

for siblings in siblingsArray:
    print(siblings.text)

parent est Get balise parent immédiate et find_next_siblings renvoient la liste de la balise suivante des frères et sœurs.


0 commentaires

0
votes

Si vous avez BeautifulSoup moderne, vous pouvez utiliser le sélecteur CSS : contains . Puis retournez avec la méthode find_parent () .

xyz
address
phone number

Imprime:

from bs4 import BeautifulSoup

s = '''
<tr>
    <td>Other1</td>
    <td>Other1</td>
    <td>Other1</td>
</tr>
<tr>
    <td>
        <a>xyz</a>
    </td>
    <td>address</td>
    <td>phone number</td>
</tr>'''

soup = BeautifulSoup(s, 'lxml')

for td in soup.select_one('a:contains(xyz)').find_parent('tr').select('td'):
    print(td.text.strip())


0 commentaires

1
votes

Avec bs4 4.7.1, combinez les pseudo-classes de : has et : contains pour récupérer la ligne et tds à l'intérieur.

Ce bit cible le bon une balise si présente par son texte

from bs4 import BeautifulSoup as bs

html = '''
<tr>
    <td>
        <a>xyz</a>
    </td>
    <td>address</td>
    <td>phone number</td>
</tr>
'''

soup = bs(html, 'lxml')
items = [item.text.strip() for item in soup.select('tr:has(a:contains("xyz")) td')]
print(items)

Vous récupérez alors la ligne parente ( tr ) ayant ce a code> tag

tr:has(a:contains("xyz"))

Et enfin, utilisez un combinateur descendant et td sélecteur de type pour obtenir tous les td dans cette ligne. Utilisation d'une compréhension de liste pour renvoyer la liste.

a:contains("xyz")


0 commentaires

0
votes

Vous pouvez utiliser xpath. find_elements_by_xpath ().

https://www.softwaretestingmaterial.com/how-to-locate-element-by-xpath-locator/


0 commentaires