Als ich mit Python versuchte, einen hierarchischen Baum aller XPaths auf einer Website (https://startpagina.nl) zu erhalten, versuchte ich zunächst, den XPath eines Zweigs zu ermitteln, indem ich Folgendes verwendete: /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()
Basierend auf der Antwort von @Prophet wird eine Liste aller Elemente auf der Website erstellt. Allerdings habe ich nicht herausgefunden, wie ich den XPath dieser Elemente ermitteln oder sie in einer Baumstruktur sortieren kann.
Die Optionen und /html/body/div[6]
erzeugen stattdessen Bäume der Länge 1.
Basierend auf der Antwort von @Micheal Kay habe ich versucht, XML mit dem folgenden Python-Code zu durchlaufen:
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("$$$$$$$$$$")
Allerdings habe ich nicht herausgefunden, wie ich den XPath der einzelnen Elemente ermitteln kann.
Also möchte ich fragen:
Wie verwende ich Python, um den Baum aller XPaths auf der Website abzurufen? (Ich frage mich, ob der Baum zyklisch ist, obwohl ich hoffe, dass ich es weiß, sobald ich herausgefunden habe, wie ich an den Baum komme.)
Basierend auf manuellem Durchsuchen von HTML: Ich möchte, dass die Ausgabe so aussieht:
| /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] ....
Dies ist ein Beispiel für eine Baumliste.
选择一个或多个元素的 XPath 总数是无限的(例如,它将包括像
/a/b/../b/../b/../b
这样的路径),但是如果您限制将自己添加到/a[i]/b[j]/c[k]
形式的路径,则路径数等于元素数,并且 XPaths 的“树”与原始 XML 树同构.如果您想要不带数字谓词的不同路径,例如
/a/b/c
、/a/b/d
,那么最简单的方法可能是遍历 XML 文档,获取每个元素的路径(以这种形式)并消除重复项。如果您想要树结构而不是简单的路径列表,请使用嵌套地图/字典来构建它。它抱怨
/html/body/
的原因是合法的 XPath 表达式不能包含尾随/
。