Implémentation Python : Comment obtenir l'arborescence de tous les XPaths du site Web ?
P粉155832941
P粉155832941 2024-02-21 15:05:16
0
1
392

Méthode 1

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.

Méthode 2

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.

Question

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

Résultat attendu

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.

P粉155832941
P粉155832941

répondre à tous(1)
P粉127901279

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'origine

Si 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 表达式不能包含尾随 /.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal