Pelaksanaan Python: Bagaimana untuk mendapatkan struktur pokok semua XPath dalam laman web?
P粉155832941
P粉155832941 2024-02-21 15:05:16
0
1
353

Kaedah 1

Semasa cuba mendapatkan pepohon hierarki semua xpath dalam tapak web (https://startpagina.nl) menggunakan Python, saya mula-mula cuba mendapatkan xpath cawangan menggunakan: /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()

Berdasarkan jawapan @Nabi, ini menghasilkan senarai semua elemen dalam laman web. Walau bagaimanapun, saya tidak tahu cara mendapatkan xpath unsur-unsur ini, atau cara menyusunnya ke dalam struktur pokok.

Pilihan

dan /html/body/div[6] menjana pokok dengan panjang 1 sebaliknya.

Kaedah 2

Berdasarkan jawapan @Micheal Kay, saya mencuba "merentasi xml" menggunakan kod Python berikut:

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("$$$$$$$$$$")

Namun, saya tidak tahu bagaimana untuk mendapatkan xpath elemen individu.

Soalan

Jadi saya nak tanya:

Bagaimana untuk menggunakan Python untuk mendapatkan pokok semua xpaths dalam laman web? (Saya tertanya-tanya sama ada pokok itu kitaran, walaupun saya harap saya akan tahu sebaik sahaja saya mengetahui cara mendapatkan pokok itu.).

Output yang dijangkakan

Berdasarkan menyemak imbas HTML secara manual: Saya mahu output kelihatan seperti ini:

| /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]
....

Ini akan menjadi contoh senarai pokok.

P粉155832941
P粉155832941

membalas semua(1)
P粉127901279

Jumlah bilangan XPaths yang memilih satu atau lebih elemen adalah tidak terhingga (cth. ia akan menyertakan laluan dalam bentuk /a/b/../b/../b/../b 这样的路径),但是如果您限制将自己添加到 /a[i]/b[j]/c[k], kemudian bilangan laluan sama dengan bilangan elemen dan "pokok" XPaths adalah isomorfik kepada pokok XML asal

Jika anda mahukan laluan berbeza tanpa predikat berangka, seperti /a/b/c/a/b/d, maka cara paling mudah mungkin adalah dengan menggelung dokumen XML, dapatkan laluan untuk setiap elemen (dalam bentuk ini) dan hapuskan pendua. Jika anda mahukan struktur pokok dan bukannya senarai laluan yang ringkas, gunakan peta/kamus bersarang untuk membinanya.

Ia mengeluh /html/body/ 的原因是合法的 XPath 表达式不能包含尾随 /.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan