Rumah  >  Soal Jawab  >  teks badan

Pelaksanaan Python: Bagaimana untuk mendapatkan struktur pokok semua XPath dalam laman web?

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粉155832941P粉155832941240 hari yang lalu315

membalas semua(1)saya akan balas

  • P粉127901279

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

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

    balas
    0
  • Batalbalas