Как я могу получить дочерние элементы элемента HTML, используя puppeteer, чтобы создать дерево HTML вместе с их стилем, вычисляемым браузером?

Вы можете сделать это в pom.xml, но вы также можете отредактировать проект в Eclipse и определить исходные папки там

Я заметил, что вы на самом деле неправильно читаете стандартную структуру Apache, это следует за соглашением Maven src/main/java и т. д., поэтому я буду использовать это. Затем, если вы используете некоторую форму интеграции Maven-Eclipse, исходные папки должны автоматически устанавливаться правильно по умолчанию. Раньше я делал это с помощью mvn eclipse:eclipse (используя eclipse-maven-plugin), но это уже давно - я использую Intellij сейчас. Я догадываюсь, что Eclipse автоматически получает исходный путь от Maven.

0
задан Md. Abu Taher 22 January 2019 в 04:05
поделиться

1 ответ

Если вы не возражаете против упорядочения элементов, вы можете создать массив всех элементов, используя простой селектор body * и цикл.

Во-первых, давайте абстрагируем экстрактор стилей, потому что мы будем использовать одно и то же несколько раз.

// get the styles for particular element
// apply all kind of JSON filtering here
function getElementStyles(elem) {
    return JSON.parse(JSON.stringify(getComputedStyle(elem)))
}

// this will generate a single array containing all elements
function getStyleArray(selector) {
    const styles = []
    const allElements = document.querySelectorAll(selector)
    for (const element of allElements) {
        const style = getElementStyles(element)
        styles.push(style)
    }
    return styles;
}

//usage
getStyleArray('body *')

Если вы хотите получить дерево, для этого уже есть несколько библиотек. Это, как говорится, вот как вы можете повторить один самостоятельно. Я использовал рекурсию, чтобы пройти через это.

// find if element is an element :D
function isElement(element) {
    return element instanceof Element || element instanceof HTMLDocument;
}

// this will generate a tree style array
// all child elements are accesible using the child key
function getChildStyles(elem) {
    const childStyles = []
    for (let childNode of elem.childNodes) {
        if (isElement(childNode)) {
            const singleChildStyle = getElementStyles(childNode)

            // recursion
            if (childNode.hasChildNodes()) {
                singleChildStyle.child = getChildStyles(childNode)
            }
            childStyles.push(singleChildStyle)
        }
    }
    return childStyles
}

// usage
getChildStyles(document.body)

Обратите внимание,

  • , что это можно улучшить, используя лучшие циклы и другие методы сортировки / поиска.
  • это будет стоить вам много времени, если на странице много элементов.

Результат: enter image description here

Это работает !!!

Давайте применим на кукловода, вы можете просто скопировать вставить их или используйте addScriptTag .

await page.evaluate(() => {
        // add the scripts we created somewhere and then use them here
        return {
            arrayBased: getStyleArray('body *'),
            treeBased: getChildStyles(document.body)
        }
})
0
ответ дан Md. Abu Taher 22 January 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: