Je dois utiliser requests_html pour le contenu JavaScript. Code:

<td class="text-left worker-col truncated"><a href="/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fa/38-G1x" style="color:red">38-G1</a></td>

Je veux trouver tous les noms (38-G1 dans ce cas) avec la couleur rouge. Je veux les rechercher d'ici style="color:red". Est-ce possible avec requests_html ? Comment puis-je faire ceci?

-2
Dixy 28 nov. 2021 à 00:37

2 réponses

Meilleure réponse

J'utilise à la fois une session html et du sélénium avec bs4. Selenium fonctionne bien mais la session html est incapable de rendre js.

Coder avec du sélénium. (Succès)

from bs4 import BeautifulSoup
import time
from selenium import webdriver


driver = webdriver.Chrome('chromedriver.exe')
url = "https://eth.nanopool.org/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fd4a"
driver.get(url)
time.sleep(8)

soup = BeautifulSoup(driver.page_source, 'html.parser')
for t in soup.select('table.table.table-bordered.table-hover.table-responsive tr'):
    txt= t.select_one('td:nth-child(2) > a')
    text= txt.text if txt else None
    print(text)

Production:

38-G15
47_G15_2   
47-G1      
49-O15     
90_GGX     
91_ASF     
105_MGPM_3 
112-GG3    
121-APRO   
188-MGPM1  
198-AP     
248_MGPM_1 
262-GUD    
265_ASF    
302-AD     
355-GUD.2  
Rig_3471855
rigEdge    
107_MGPM_3 
None
None

Code avec session html (pas de rendu js)

from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://eth.nanopool.org/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fd4a')
soup = BeautifulSoup(response.content, 'html.parser')

for t in soup.select('table.table.table-bordered.table-hover.table-responsive tr'):
    txt= t.select_one('td:nth-child(2) > a')
    text= txt.text if txt else None
    print(text)
0
Fazlul 28 nov. 2021 à 07:08
Merci beaucoup, avec Selenium je l'ai eu :)
 – 
Dixy
28 nov. 2021 à 06:27

Vous pouvez trouver toutes les balises <a> et les mettre dans une liste si elles ont cet attribut.

Obtenez votre page :

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('your_url')

Puis recherchez toutes les balises d'ancrage avec

anchors = r.html.find('a')

Et à la fin obtenir le contenu de toutes les balises dont l'attribut style est égal à color:red

names = []
for a in anchors:
    if a.attrs['style'] == "color:red":
        names.append(a.text)

Malheureusement, cela ne fonctionnera que pour les styles en ligne spécifiés dans la balise d'ancrage, mais si votre exemple est représentatif, cela devrait fonctionner.

Edit : je vois qu'un autre utilisateur vous a donné une solution avec BeautifulSoup et j'aimerais ajouter que si vous débutez dans le webscraping, mais que vous prévoyez d'en apprendre davantage, je vous recommande également d'apprendre à utiliser BeautifulSoup. Ce n'est pas seulement plus puissant, mais sa base d'utilisateurs est beaucoup plus grande, il est donc plus facile de trouver des solutions à votre problème.

0
zoltankundi 28 nov. 2021 à 01:52
Je ne sais pas pourquoi mais anchors = r.html.find('a') n'a pas <a href="/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fa/38-G1x" style="color:red">38-G1</a>.
 – 
Dixy
28 nov. 2021 à 04:15
Et if a.attrs['style'] == "color:red": a une erreur KeyError: 'style'. Je vous donne l'url pour que vous puissiez le voir vous-même. 'https://eth.nanopool.org/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fd4a'
 – 
Dixy
28 nov. 2021 à 04:21