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