Не удается получить координаты из iframe ArcGIS на веб-странице с помощью запросов

Я создал скрипт для получения координат (в данном случае -119.412 49.023) с карты, расположенной в страница интернета, с помощью модуля requests. Когда я пытаюсь использовать свой скрипт ниже, я ничего не получаю. Я знаю, что могу получить эту часть с помощью selenium, но я хочу сделать это с помощью модуля requests. Я заглянул в инструменты разработчика, чтобы найти хоть какую-нибудь подсказку о том, как я могу его захватить, но не повезло.

Этот — это место, где находятся координаты.

import requests
from bs4 import BeautifulSoup

link = 'https://www.rdos.bc.ca/development-services/planning/current-applications-decisions/electoral-area-a/a2018207-zone/'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    res = s.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    print(soup.select_one("[data-dojo-attach-point='coordinateInfo']"))

Как я могу получить координаты с этого сайта с помощью requests?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать requests-html, который автоматически загрузит Chromium при первом рендеринге.
https://pypi.org/project/requests-html/

Однако он не получает содержимое элемента <iframe src = "{}">, поэтому мы .search() ссылку iframe, .render() эту страницу отдельно, а затем ждем загрузки coordinateInfo.

import asyncio

from bs4 import BeautifulSoup
import requests_html

link = 'https://www.rdos.bc.ca/development-services/planning/current-applications-decisions/electoral-area-a/a2018207-zone/'


async def get_content(page):
    content = await page.content()
    while 'coordinateInfo' not in content or 'loading...' in content:
        await asyncio.sleep(1)
        content = await page.content()
    await page.close()
    return content

with requests_html.HTMLSession() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    res = s.get(link)
    iframe_link = res.html.search('iframe src = "{}"')[0].replace('&amp;', '&')
    iframe_res = s.get(iframe_link)
    iframe_res.html.render(keep_page=True)
    content = s.loop.run_until_complete(get_content(iframe_res.html.page))
    soup = BeautifulSoup(content, "lxml")
    print(soup.select_one("[data-dojo-attach-point='coordinateInfo']"))
Ответ принят как подходящий

*Значение координат полностью зависит от JavaScript, а модуль requests не может отображать JavaScript

** Чтобы увидеть значение координат, нужно scroll down by JavaScript ececution

*** Значение координат меньше iframe

**** Итак, чтобы получить значение координат, вам нужна автоматизация, например, селен.

***** Я использую selenium4 pip установить селен и вебдрайверменеджер

****** Не используйте maximize_window_size(), если это так, то он скажет переместить мышь и увидеть координаты, обычно вы можете увидеть координату слева внизу после завершения выполнения селена

Скрипт:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.chrome.options import Options

option = webdriver.ChromeOptions()

# Chrome to stay open 
option.add_experimental_option("detach", True)

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=option)
driver.get('https://www.rdos.bc.ca/development-services/planning/current-applications-decisions/electoral-area-a/a2018207-zone/')


wait = WebDriverWait(driver, 30)

# Execute Javascript  to scroll down to see the coordinates 
driver.execute_script("arguments[0].scrollIntoView();", wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@class = "bb-textmedia__content"]'))))

#Switch to iframe
driver.get(wait.until(EC.visibility_of_element_located((By.XPATH, '(//iframe)[1]'))).get_attribute('src'))

coordinates = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@class = "coordinate-info jimu-float-leading jimu-align-leading"]'))).text.replace('Degrees','')
print(coordinates)

Выход:

-119.554 49.229 

Другие вопросы по теме