2017-02-13 3 views
2
  • Utilisation de Python3 pour scrapper un site Web. Utiliser la requête xpath pour récupérer la chaîne désirée.
  • Il semble qu'il y ait environ 19 éléments que les données doivent interroger, cependant la variable dataId n'enregistre qu'une entrée.
  • J'essaie également d'obtenir le data-eventid, qui est dans la balise/tr elle-même (image incluse). Cependant, le code semble maintenant exclure cette balise html

Ma compréhension est-elle erronée?Python3 - La requête XPath ne renvoie pas la liste complète du site lors de la tentative d'obtention des valeurs d'attribut de données

import requests 
from lxml import etree 

url = 'http://www.forexfactory.com/calendar.php?' 
date = {'day':'feb9.2017'} 

resp = requests.get(url,date) 

tree = etree.HTML(resp.text) 
dataId = tree.xpath("string(//*[@id='flexBox_flex_calendar_mainCal']//tr[contains(@class,'calendar__row calendar_row')])") 

xpath query result in firefox

debug values

Répondre

2

La fonction string() autour de votre XPath recevait le texte de la première elemnet. Si vous supprimez cela, vous pouvez obtenir une collection des éléments interrogés. De là, vous pouvez itérer sur les éléments et accéder à la propriété data-eventid sur l'élément de attrib property:

tree = etree.HTML(resp.text) 
for row in tree.xpath("//*[@id='flexBox_flex_calendar_mainCal']//tr[contains(@class,'calendar__row calendar_row')]"): 
    print(row.attrib['data-eventid']) 

En outre, puisque vous accédez toujours attribut data-eventid de l'élément, il peut être plus sûr de ne sélectionner que des éléments avec data-eventid attributs en ajoutant [@data-eventid] à votre XPath:

tree = etree.HTML(resp.text) 
for row in tree.xpath("//tr[contains(@class,'calendar__row calendar_row')][@data-eventid]"): 
    print(row.attrib['data-eventid']) 
+1

Merci! Cela a fait l'affaire – Karun