2017-08-28 1 views
1

Je veux analyser ce "<a href="javascript:8==99999?popDuelloDialog(2754288):popTeam(2386)">Gnistan</a>" et extraire le texte.Comment analyser le texte à partir d'une balise d'ancrage?

J'ai essayé d'extraire beaucoup, mais je ne pouvais pas réussir.

Je ne sais pas comment construire une méthode avec ce format « javascript vient » :(numbers) "qui ne sont pas répéter. Je besoin d'une telle méthode qui utilisera uniquement la partie répétition et va extraire du texte dans le corps.

Mon code est ici:

import sys 
from PyQt4.QtGui import QApplication 
from PyQt4.QtCore import QUrl 
from PyQt4.QtWebKit import QWebPage 
import bs4 as bs 
import urllib.request 
import re 
from bs4 import BeautifulSoup 

class Client(QWebPage): 

    def __init__(self, url): 
     self.app = QApplication(sys.argv) 
     QWebPage.__init__(self) 
     self.loadFinished.connect(self.on_page_load) 
     self.mainFrame().load(QUrl(url)) 
     self.app.exec_() 

    def on_page_load(self): 
     self.app.quit() 

url = 'http://www.mackolik.com/Genis-Iddaa-Programi' 
client_response = Client(url) 
source = client_response.mainFrame().toHtml() 
soup = bs.BeautifulSoup(source, 'html.parser') 
#pattern=re.compile(r"javascript:;") 
#js_test = soup.find_all('a', href='javascript') 
hreff=soup.find_all("a","javascript:;") 
#js_test=soup.select('a[href^="javascript:\('(.*?)'\);"]') 
#print(js_test.text) 
#type(href) 
for i in hreff: 
    print(hreff[i]) 
+0

Vous voulez juste analyser « Gnistan »? –

+0

Ouais. Tout d'abord je veux analyser "Gnistan", sur la même page il y a beaucoup de textes que je veux analyser, alors bien sûr je vais appliquer la même méthode pour les autres. –

+0

@TylerH, vous avez changé et généralisé le nom du sujet qui ne rend pas plus facile à atteindre et à trouver ce genre de question. Je crois qu'il y a beaucoup de gens qui recherchent la même chose mais ne comprennent jamais à partir des termes généralisés tels que l'étiquette d'ancrage. Il est plus facile de faire une recherche sur google "

Répondre

0

IIUC tout ce que vous avez besoin est de make BeautifulSoup obtenir toutes les balises d'ancrage qui ont le "javascript" dans leur attribut href. Cependant, il semble que le contenu que vous voulez analyser est en cours de création avec JavaScript, et cela nécessiterait l'utilisation de selenium et d'un pilote Web comme ChromeDriver. En utilisant BeautifulSoup et demandes que nous pouvons voir que le contenu que vous voulez probablement est pas dans le code html, la logique pour résoudre votre problème serait:

from bs4 import BeautifulSoup 
import requests 
url = "http://www.mackolik.com/Genis-Iddaa-Programi" 
data = requests.get(url).text 
soup = BeautifulSoup(data, 'html.parser') 

for tag in soup.findAll('a'): 
    if "javascript" in tag['href']: 
     print(tag.text) 

Le code ci-dessus vérifie si la sous-chaîne "javascript" est in la Attribuez href et imprime le texte de l'étiquette si cela est vrai.

Avec le sélénium et ChromeDriver la logique est à peu près la même chose, mais nous avons besoin d'autres méthodes:

from selenium import webdriver 

url = "http://www.mackolik.com/Genis-Iddaa-Programi" 
driver = webdriver.Chrome() 
driver.get(url) 

for tag in driver.find_elements_by_tag_name("a"): 
    if "javascript" in tag.get_attribute("href"): 
     print(tag.text) 
+0

Merci @ Vinicius Aguiar. Ça fonctionne bien. Maintenant, je vais modifier le code, puis il imprimera sous forme agréable. Merci encore beaucoup. Votre solution est intelligente –

0

vous pouvez faire comme cela, je sais qu'il est en VB, mais vous pouvez prendre l'idée ...

'look for the begining of <a href 
    Dim xstr As String = "<a href=javascript:8==99999?popDuelloDialog(2754288):popTeam(2386)>Gnistan</a>" 
    Dim xStart As Integer = InStr(xstr, "<a href") 
    If xStart > 0 Then 
     'look for the end 
     Dim AHREF As Integer = InStr(xStart, xstr, ">") + 1 
     'look for </a> 
     Dim endAHREF As Integer = InStr(AHREF, xstr, "</a>") 
     'take what you need 
     Dim Result As String = Mid(xstr, AHREF, endAHREF - AHREF) 


    End If 
+0

You apply here divide and conquer operation. You divided the anchor tag into two piece then subtract from each other then find the parsed text. I will try this method by myself. If I can succeed it i will share it in here. –

+0

yeah exactly. then if you want to do a bunch of them then just remove everything before "" dans votre chaîne et répétez la boucle. –