En essayant d'obtenir un arbre hiérarchique de tous les XPaths d'un site Web (https://startpagina.nl) en utilisant Python, j'ai d'abord essayé d'obtenir le XPath d'une branche en utilisant : /html/body
:
from selenium import webdriver url = 'https://startpagina.nl' driver = webdriver.Firefox() driver.get(url) test = driver.find_elements_by_xpath('//*') print(len(test)) driver.close()
Sur la base de la réponse de @Prophet, cela génère une liste de tous les éléments du site Web. Cependant, je n'ai pas compris comment obtenir le chemin XPath de ces éléments, ni comment les trier dans une arborescence.
Les options et /html/body/div[6]
génèrent à la place des arbres de longueur 1.
Sur la base de la réponse de @Micheal Kay, j'ai essayé de "traverser XML" en utilisant le code Python suivant :
import requests from bs4 import BeautifulSoup import xml.etree.cElementTree as ET from lxml import etree unformatted_filename = "first.xml" formatted_filename = "first.xml" # Get XML from url. resp = requests.get("https://startpagina.nl") # resp = requests.get('https://stackoverflow.com') with open(unformatted_filename, "wb") as foutput: foutput.write(resp.content) # Improve XML formatting with open(unformatted_filename) as fp: soup = BeautifulSoup(fp, "xml") print(f"soup={soup}") with open(formatted_filename, "w") as f: f.write(soup.prettify()) # Parse XML tree = ET.parse(formatted_filename, parser=ET.XMLParser(encoding="utf-8")) root = tree.getroot() for child in root: child.tag, child.attrib tree = ET.parse(formatted_filename) for elem in tree.getiterator(): if elem.tag: print("my name:") print("\t" + elem.tag) if elem.text: print("my text:") print("\t" + (elem.text).strip()) if elem.attrib.items(): print("my attributes:") for key, value in elem.attrib.items(): print("\t" + "\t" + key + " : " + value) if list(elem): # use elem.getchildren() for python2.6 or before print("my no of child: %d" % len(list(elem))) else: print("No child") if elem.tail: print("my tail:") print("\t" + "%s" % elem.tail.strip()) print("$$$$$$$$$$")
Cependant, je n'ai pas compris comment obtenir le chemin XPath des éléments individuels.
Je veux donc demander :
Comment utiliser Python pour obtenir l'arborescence de tous les XPaths du site ? (Je me demande si l'arbre est cyclique, même si j'espère que je le saurai une fois que j'aurai compris comment obtenir l'arbre.).
Basé sur la navigation manuelle HTML : Je veux que le résultat ressemble à ceci :
| /html |-- //*[@id="browser-upgrade-notification"] |-- //*[@id="app"] |-- /html/head |-- /html/body |--/-- /html/body/noscript |--/-- /html/body/div[2] |--/-- /html/body/header/section |--/--/-- /html/body/header/section/div |--/--/--/-- /html/body/header/section/div/div[1] ....
Ce sera un exemple de liste d'arbres.
Le nombre total de XPaths qui sélectionnent un ou plusieurs éléments est infini (par exemple, il inclura des chemins de la forme
/a/b/../b/../b/../b
这样的路径),但是如果您限制将自己添加到/a[i]/b[j]/c[k]
, alors le nombre de chemins est égal au nombre d'éléments, et "l'arbre" des XPaths est isomorphe à l'arborescence XML d'origineSi vous souhaitez un chemin différent sans prédicat numérique, comme
/a/b/c
、/a/b/d
, alors le moyen le plus simple est probablement de parcourir le document XML, d'obtenir le chemin de chaque élément (sous cette forme) et d'éliminer les doublons. Si vous souhaitez une structure arborescente au lieu d'une simple liste de chemins, utilisez des cartes/dictionnaires imbriqués pour la construire.Il se plaint
/html/body/
的原因是合法的 XPath 表达式不能包含尾随/
.