lxml.html l'analyse avec XPath et les variables
J'ai ce fragment de code HTML
<div id="dw__toc">
<h3 class="toggle">Table of Contents</h3>
<div>
<ul class="toc">
<li class="level1"><div class="li"><a href="#section">#</a></div>
<ul class="toc">
<li class="level2"><div class="li"><a href="#link1">One</a></div></li>
<li class="level2"><div class="li"><a href="#link2">Two</a></div></li>
<li class="level2"><div class="li"><a href="#link3">Three</a></div></li>
Maintenant, je veux analyser avec lxml.html. À la fin, je veux une fonction où je peux fournir un searchterm (c'est à dire "un") et la fonction doit retourner
One
#link1
Pour l'instant j'essaye de mettre une variable dans l'expression XPath.
Travaux:
import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")
test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a/text()='One'")
print test
Essayer avec la variable. Je veux remplacer le codé en dur 'One'
avec une variable que je peux retourner à la fonction plus tard.
Ne fonctionne pas:
import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")
desiredvars = ['One']
myresultset=((var, html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='%s']"%(var))[0]) for var in desiredvars)
for each in myresultset:
print each
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
IndexError: list index out of range
Ceci est basé sur cette réponse: https://stackoverflow.com/a/10688235/2320453
Aucune idée de pourquoi ça ne fonctionne pas? Est-ce la "bonne façon" de faire quelque chose comme cela?
EDIT:
Pour résumer les choses:
Je veux rechercher dans l'une des Balises et le texte à partir de ces Attributs, mais je ne veux pas d'une liste complète au lieu de cela, je veux être en mesure de rechercher avec une variable.
Pseudo-code:
import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")
searchterm = 'one'
test=html.xpath("...a/text()=searchterm")
print test
Résultat attendu
One
#link1
OriginalL'auteur duenni | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
Votre premier exemple woks, mais probablement pas la façon dont vous pensez qu'il est recommandé de:
Ce que cela retourne un booléen, qui sera vrai si la condition
...='One'
est vrai pour les nœuds dans le jeu de résultats sur le côté gauche de l'expression xpath. Et c'est pourquoi vous obtenez le message d'erreur dans votre deuxième exemple:True[0]
n'est pas valide.Vous probalby voulez tous les nœuds correspondant à l'expression, avoir
'One'
en tant que texte. L'expression correspondante serait:Ceci renvoie à un ensemble de nœuds, comme le résultat, ou si vous avez juste besoin de l'url comme une chaîne de caractères:
True
. Votre premier exemple imprimeElement at 0xc99b90
. Comment puis-je l'amener à imprimerOne
et remplacer leOne
dans/a[text()='One']
avec une variable? J'ai aussi édité le premier post, foiré certains entre parenthèses dans la première place....text()
sélectionne un nœud de texte, de sorte.../a/text()
yould retourner une liste de tous les textes contenst de tous les ancrages, si c'est ce que vous avez besoin, ou vous pouvez utiliser l'élément retourné pour accéder à ses attributs à partir de python.Il est donc préférable de récupérer une liste avec tous les éléments et de recherche dans cette liste de python au lieu de rétrécir la Xpath-expression à retourner uniquement le seul élément que je suis à la recherche de?
Édité mon premier post pour clarifier.
si vous utilisez quelque chose comme
".../a[text()=%r]" % searchterm
vous obtenez une liste de tous les nœuds correspondants, si vous ajoutez/@href
vous obtenez le href du contenu ou si vous ajoutez/text()
vous obtenir le contenu du texte (ce qui serait assez pointles que c'est le terme que vous cherchez), toujours comme une liste... Ce qui est le mieux à utiliser dépend de votre cas d'utilisation concrets.OriginalL'auteur mata
J'ai essayé de mata de réponse, mais pour moi n'a pas fonctionné:
J'ai trouvé ceci sur leur site web http://lxml.de/xpathxslt.html#the-xpath-method pour ceux qui auraient le même problème :
my_div = x.xpath(".//div[@id='%s']"%div_name)[0]
fonctionne très bien aussiOriginalL'auteur symbiotech