peut-on utiliser xpath avec BeautifulSoup?
Je suis avec BeautifulSoup de gratter un url et j'ai eu le code suivant
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
soup.findAll('td',attrs={'class':'empformbody'})
Maintenant dans le code ci-dessus, nous pouvons utiliser findAll
pour obtenir des balises et des informations les concernant, mais je veux l'utiliser xpath. Est-il possible d'utiliser xpath avec BeautifulSoup? Si possible, quelqu'un peut-il me montrer un exemple de code de sorte qu'il sera plus utile?
Vous devez vous connecter pour publier un commentaire.
Nope, BeautifulSoup, par lui-même, ne prend pas en charge les expressions XPath.
Une bibliothèque alternative, lxml, ne support de XPath 1.0. Il a un BeautifulSoup mode compatible où il va essayer de l'analyser rompu HTML de la manière la Soupe n'. Cependant, la par défaut lxml analyseur HTML fait juste le bon emploi de l'analyse rompu HTML, et je crois qu'il est plus rapide.
Une fois que vous avez analysé votre document en un lxml arbre, vous pouvez utiliser le
.xpath()
méthode pour rechercher des éléments.D'intérêt possible pour vous, c'est le Sélecteur CSS de soutien; la
CSSSelector
classe se traduit par CSS dans les expressions XPath, de faire votre recherche pourtd.empformbody
beaucoup plus facile:La boucle: BeautifulSoup lui-même ne ont très complet Sélecteur CSS de soutien:
Je peux confirmer qu'il n'y a pas de charge de XPath dans un cadre Magnifique de la Soupe.
Martijn code ne fonctionne plus correctement (il est de plus de 4 ans maintenant...), la
etree.parse()
ligne affiche à la console et ne pas affecter la valeur de latree
variable. Référencement cette, j'ai été en mesure de comprendre cela fonctionne à l'aide de requêtes et lxml:BeautifulSoup a une fonction nommée findNext de l'élément courant dirigé childern,donc:
Code ci-dessus peut imiter la xpath suivante:
J'ai cherché par le biais de leur docs et il semble qu'il n'est pas xpath option. Aussi, comme vous pouvez le voir ici sur une question similaire, et l'OP est de demander une traduction de xpath pour BeautifulSoup, donc ma conclusion serait - non, il n'y a pas de xpath d'analyse disponibles.
scrapy
est une autre option pour obtenir lxml de travail wit BSlorsque vous utilisez lxml simple:
mais lors de l'utilisation BeautifulSoup BS4 tout simple:
essayer cette magie:
comme vous le voyez, cela ne prend pas en charge les sous-tag, j'ai donc supprimer "/@href" partie
C'est un assez vieux thread, mais il y a une solution maintenant, qui peut ne pas avoir été dans BeautifulSoup à l'époque.
Voici un exemple de ce que j'ai fait. J'ai utiliser la rubrique "demandes" du module pour lire un flux RSS et obtenir son texte contenu dans une variable appelée "rss_text". Avec qui, je le lance thru BeautifulSoup, recherche pour l'xpath /rss/channel/titre, et récupérer son contenu. Ce n'est pas exactement XPath dans toute sa splendeur (caractères génériques, plusieurs chemins d'accès, etc.), mais si vous avez juste un chemin de base que vous souhaitez localiser, cela fonctionne.