首頁  >  問答  >  主體

Python實作:如何取得網站中所有XPath的樹狀結構?

方法一

在嘗試使用Python 取得網站(https://startpagina.nl) 中所有xpath 的分層樹時,我首先嘗試使用下列方法取得分支的xpath:/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()

根據 @Prophet 的回答,這會產生網站中所有元素的清單。但是,我還沒有確定如何取得這些元素的 xpath,也沒有確定如何將它們排序成樹狀結構。

/html/body/div[6] 選項產生長度為 1 而不是樹。

方法二

根據 @Micheal Kay 的回答,我嘗試使用以下 Python 程式碼「遍歷 xml」:

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

但是,我還沒有確定如何取得各個元素的 xpath。

問題

所以我想問一下:

如何使用 Python 取得網站中所有 xpath 的樹? (我想知道這棵樹是否是循環的,儘管我希望一旦我知道如何獲得這棵樹我就會知道。)。

預期輸出

基於手動瀏覽 HTML: 我希望輸出看起來像這樣:

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

這將是樹列表的範例。

P粉155832941P粉155832941240 天前313

全部回覆(1)我來回復

  • 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 表達式不能包含尾隨 /

    回覆
    0
  • 取消回覆