suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Python-Implementierung: Wie erhalte ich die Baumstruktur aller XPaths auf der Website?

Methode 1

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.

Methode 2

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.

Frage

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.)

Erwartete Ausgabe

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.

P粉155832941P粉155832941302 Tage vor386

Antworte allen(1)Ich werde antworten

  • P粉127901279

    P粉1279012792024-02-22 13:34:15

    选择一个或多个元素的 XPath 总数是无限的(例如,它将包括像 /a/b/../b/../b/../b 这样的路径),但是如果您限制将自己添加到 /a[i]/b[j]/c[k] 形式的路径,则路径数等于元素数,并且 XPaths 的“树”与原始 XML 树同构.

    如果您想要不带数字谓词的不同路径,例如 /a/b/c/a/b/d,那么最简单的方法可能是遍历 XML 文档,获取每个元素的路径(以这种形式)并消除重复项。如果您想要树结构而不是简单的路径列表,请使用嵌套地图/字典来构建它。

    它抱怨 /html/body/ 的原因是合法的 XPath 表达式不能包含尾随 /

    Antwort
    0
  • StornierenAntwort