Spaces:
No application file
No application file
| import asyncio | |
| from pyppeteer import launch | |
| from pyppeteer.errors import ElementHandleError | |
| async def highlight_element(page, attribute): | |
| try: | |
| element = await page.querySelector(attribute) | |
| if element: | |
| await page.evaluate('element => element.style.backgroundColor = "yellow"', element) | |
| styles = await page.evaluate('(element) => { const computedStyles = window.getComputedStyle(element); return Array.from(computedStyles).map(prop => `${prop}: ${computedStyles.getPropertyValue(prop)}`); }', element) | |
| return styles | |
| except ElementHandleError: | |
| pass | |
| return None | |
| async def getStyles(page, attribute, text_file): | |
| try: | |
| await page.waitForSelector(attribute) | |
| container_styles = await page.evaluate('''(attribute) => { | |
| const container = document.querySelector(attribute); | |
| const computedStyles = getComputedStyle(container); | |
| const styles = {}; | |
| for (let i = 0; i < computedStyles.length; i++) { | |
| const prop = computedStyles[i]; | |
| styles[prop] = computedStyles.getPropertyValue(prop); | |
| } | |
| return styles; | |
| }''', attribute) | |
| styles = await page.evaluate('''(attribute) => { | |
| const container = document.querySelector(attribute); | |
| const elements = container.querySelectorAll("*"); | |
| const extractStyles = (element, tagName, index, totalIndex) => { | |
| const computedStyles = getComputedStyle(element); | |
| const styles = {}; | |
| for (let i = 0; i < computedStyles.length; i++) { | |
| const prop = computedStyles[i]; | |
| styles[prop] = computedStyles.getPropertyValue(prop); | |
| } | |
| return styles; | |
| }; | |
| const result = {}; | |
| elements.forEach((element, index) => { | |
| const tagName = element.tagName.toLowerCase(); | |
| const tagIndex = [...container.querySelectorAll(tagName)].indexOf(element); | |
| const totalIndex = index; | |
| const variableName = `${tagName}-${tagIndex}-${totalIndex}`; | |
| result[variableName] = extractStyles(element, tagName, tagIndex, totalIndex); | |
| }); | |
| return result; | |
| }''', attribute) | |
| with open(text_file, 'w') as f: | |
| f.write(f'Styles of container {attribute}:\n') | |
| for prop, value in container_styles.items(): | |
| f.write(f'{prop}: {value}\n') | |
| f.write('\n') | |
| for variable_name, element_styles in styles.items(): | |
| f.write(f'Here goes the styles of {variable_name}:\n') | |
| for prop, value in element_styles.items(): | |
| f.write(f'{prop}: {value}\n') | |
| f.write('\n') | |
| except ElementHandleError: | |
| pass | |
| return None | |
| async def highlightAndStyles(url, attribute): | |
| browser = await launch() | |
| page = await browser.newPage() | |
| await page.goto(url) | |
| text_file = "styles.txt" | |
| image_file = "screenshot.png" | |
| await getStyles(page, attribute, text_file) | |
| styles = await highlight_element(page, attribute) | |
| await page.screenshot({'path': image_file, 'fullPage': True}) | |
| await browser.close() | |
| url = input("Enter the URL of the web page: ") | |
| attribute = input("Enter the class or ID attribute to highlight (e.g., .container or #element): ") | |
| asyncio.get_event_loop().run_until_complete(highlightAndStyles(url, attribute)) | |
| print("Screenshot and styles saved successfully!") | |