Как я могу получить координаты HTML-элемента в Python - PullRequest
3 голосов
/ 16 апреля 2019

Мне было интересно, есть ли способ получить координаты HTML-элемента на HTML-странице, не открывая страницу в браузере. Я использую python, и я увидел, что вы можете получить некоторые запросы для получения HTML-страницы, и после этого вы можете искать внутри нее с помощью таких модулей, как bs4, но я не нашел способа получить координаты элемента, возможный? (для координат элемента я имею в виду x pos и y pos элемента, когда страница загружается посредником)

Допустим, я хочу получить HTML-текст этой страницы и я написал это

import requests
from bs4 import BeautifulSoup

data = requests.get("https://www.nike.com")
soup = BeautifulSoup(data.text, 'html.parser')

element = soup.find('p',{'class':"vVtA7wL6 headline-sm-base text-color-primary-dark"})

print(element.coords) # exists/can I create in some way a module that returns the coords?

Есть ли способ найти element.coords, когда элемент отображается в браузере?

1 Ответ

0 голосов
/ 17 апреля 2019

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

Но вы можете открыть браузер в python и запустить javascript, который получает координаты и возвращает его в python.Мы будем использовать pywebview в качестве браузера (требуется pip3 install pywebview).

Откройте окно браузера, используйте JavaScript для проверки HTML-элемента, возвращаемых значений и закройте окно браузера.Обратите внимание, что значения будут зависеть от размера окна.

import webview
from threading import Thread


def thread_fun():
  while webview.evaluate_js('document.readyState') != "complete":
    # wait for page to load
    time.sleep(0.5)

  # ask for a bounding rect
  bounding_rect = webview.evaluate_js('''
    document.querySelector("img.central-featured-logo").getBoundingClientRect()
  ''');  
  webview.destroy_window()

  print(bounding_rect)


thread = Thread(target=thread_fun)
thread.start()

webview.create_window(title="a title", url="http://wikipedia.org", width=500, height=700)

thread.join()

Результат: {'x': 150, 'y': 176, 'width': 200, 'height': 183, 'top': 176, 'right': 350, 'bottom': 359, 'left': 150}

webview.create_window должен вызываться в главном потоке, он блокирует его до тех пор, пока окно не будет уничтожено.

Подробнее о пакете веб-просмотра см. https://pywebview.flowrl.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...