Как мне очистить данные с веб-страницы, которая обновляется после отправки данных через selenium и python?

#python #selenium #web-scraping #refresh

#python #селен #очистка веб-страниц #обновить

Вопрос:

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

Вот пример вывода, он возвращает пустую строку

Я заметил, что value тег изменяется после ввода данных в

 <input id="place" name="place" type="text" placeholder="Type a place name" class="width70" style="text-transform:capitalize;" value="" required="">
 

Должен ли я манипулировать этим?
Спасибо 🙂

Вот мой код:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

counter = 0

locations = [

    'Republic of the Philippines',
    'Heaven',
    'Philippines',
]

latitude = []
longtitude = []

browser = webdriver.Chrome('C://Users/user1/Portable Python 3.7.0     x64/App/Python/Lib/site-packages/chromedriver')

url = 'https://www.latlong.net/'

for i in locations:

    browser.get(url)
    bar = browser.find_element_by_id('place')
    bar.send_keys(i)
    bar.send_keys(Keys.ENTER)
    time.sleep(3)
    lat = browser.find_element_by_id('lat')
    lng = browser.find_element_by_id('lng')

    time.sleep(3)

    latitude.append(lat.text)
    longtitude.append(lng.text)

    print(latitude[counter])
    print(longtitude[counter])

    counter =1

    browser.refresh()
 

Ответ №1:

Вы можете выполнить запрос POST

 import requests
from bs4 import BeautifulSoup as bs
import re

url = 'https://www.latlong.net/'
locations = ['Republic of the Philippines', 'Heaven', 'Philippines']
latitude = []
longitude = []

with requests.Session() as sess:

    for i in locations: 
        r = sess.get(url)
        soup = bs(r.content, 'lxml')
        token = soup.select_one('#lltoken')['value']
        data = { 'place': i, 'lltoken': token }
        r = sess.post(url, data = data)
        s = r.text

        try:
            lat_lon = re.findall( r'sm((-?d .d ),(-?d .d )', s)[0]
            lat = lat_lon[0]
            lon = lat_lon[1]
            latitude.append(lat)
            longitude.append(lon)
        except:
            print(s)

print(latitude)
print(longitude)
 

Селен:

Вы можете получить их из src iframe map. Похоже, нет необходимости в условиях ожидания, но вам может потребоваться рассмотреть возможность их добавления (или я с радостью добавлю, чтобы показать вам)

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import re

locations = [  
    'Republic of the Philippines',
    'Heaven',
    'Philippines',
]

latitude = []
longitude = []

url = 'https://www.latlong.net/'

browser = webdriver.Chrome()
browser.get(url)

for i in locations:
    bar = browser.find_element_by_id('place')
    bar.clear()
    bar.send_keys(i)
    bar.send_keys(Keys.ENTER)
    s = browser.find_element_by_id('latlongmape').get_attribute('src')
    lat_lon = re.findall( r'(-?d .d )', s)
    lat = lat_lon[0]
    lon = lat_lon[1]
    latitude.append(lat)
    longitude.append(lon)

print(latitude)
print(longitude)
browser.quit()
 

Условия ожидания с использованием другого элемента для источника:

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

locations = [

    'Republic of the Philippines',
    'Heaven',
    'Philippines',
]

latitude = []
longitude = []

url = 'https://www.latlong.net/'

browser = webdriver.Chrome()
browser.get(url)

for i in locations:
    bar = WebDriverWait(browser,5).until(EC.presence_of_element_located((By.ID, "place")))
    bar.clear()
    bar.send_keys(i)
    bar.send_keys(Keys.ENTER)
    s = WebDriverWait(browser,5).until(EC.presence_of_element_located((By.ID, "coordinateslink"))).text
    lat_lon = re.findall( r'(-?d .d )', s)
    lat = lat_lon[0]
    lon = lat_lon[1]
    latitude.append(lat)
    longitude.append(lon)

print(latitude)
print(longitude)
browser.quit()
 

Вы также можете использовать javascript для возврата значений:

 lat = browser.execute_script("return document.getElementById('lat').value;")
lon = browser.execute_script("return document.getElementById('lng').value;")
 

Вы также можете использовать регулярное выражение откуда в одном из тегов скрипта:

 lat_lon = re.findall( r'sm((-?d .d ),(-?d .d )', browser.page_source)[0]
lat = lat_lon[0]
lon = lat_lon[1]
print(lat, lon)
 

Места, где найдены значения:

Вы можете увидеть все разные места, где javascript присваивает значения координат в скрипте, который имеет следующий js:

 <script>
var mymap = L.map('latlongmap');
var mmr = L.marker([0,0]);
mmr.bindPopup('0,0');
mmr.addTo(mymap);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar',
attribution:'amp;copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(mymap);

mymap.on('click', onMapClick);

sm(14.693390,121.067238,12)
function isll(num) {
var val = parseFloat(num);
if (!isNaN(val) amp;amp; val <= 90 amp;amp; val >= -90)
    return true;
else
    return false;
}

function onMapClick(e) {
mmr.setLatLng(e.latlng);
setui(e.latlng.lat,e.latlng.lng,mymap.getZoom());
}

function dec2dms(e,t) {
document.getElementById("dms-lat").innerHTML = getdms(e, !0), document.getElementById("dms-lng").innerHTML = getdms(t, !1)
}
function getdms(e, t) {
var n = 0, m = 0, l = 0, a = "X";
return a = t amp;amp; 0 > e ? "S" : !t amp;amp; 0 > e ? "W" : t ? "N" : "E", d = Math.abs(e), n = Math.floor(d), l = 3600 * (d - n), m = Math.floor(l / 60), l = Math.round(1e4 * (l - 60 * m)) / 1e4, n   "amp;deg; "   m   "' "   l   "'' "   a
}

function sm(lt,ln,zm) {
    setui(lt,ln,zm);
    mmr.setLatLng(L.latLng(lt,ln));
    mymap.setView([lt,ln], zm);
}

function setui(lt,ln,zm) {
    lt = Number(lt).toFixed(6);
    ln = Number(ln).toFixed(6);
mmr.setPopupContent(lt   ','   ln).openPopup();
document.getElementById("lat").value=<
document.getElementById("lng").value=ln;
document.getElementById("latlngspan").innerHTML ="("   lt   ", "   ln   ")"; 
document.getElementById("coordinatesurl").value = "https://www.latlong.net/c/?lat="   lt   "amp;long="   ln;
document.getElementById("coordinateslink").innerHTML = 'amp;<a href="https://www.latlong.net/c/?lat='   lt   "amp;amp;long="   ln   '" target="_blank"amp;>('   lt   ", "   ln   ")amp;</aamp;>";
dec2dms(lt,ln);
document.getElementById('latlongmape').src='https://www.google.com/maps/embed/v1/view?key=AIzaSyALrSTy6NpqdhIOUs3IQMfvjh71td2suzYamp;maptype=satelliteamp;' 'center=' lt ','  ln 'amp;zoom=' zm;
}
       
</script> 

Ответ №2:

Проблема в том, что если вы проверяете элемент после отправки ключей.ВВЕДИТЕ, нет текста для чтения. Он каким-то образом использует другую технологию для замены «заполнителя»

 <div class="col-6 m2">
   <label for="lat">Latitude</label>
   <input type="text" name="lat" id="lat" placeholder="lat coordinate">
</div>
 

С другой стороны, вы могли бы найти идентификатор элемента «latlngspan». Это ниже карты, и там есть оба параметра — lat и long, и вы можете выполнить несколько простых операций со строками, чтобы получить нужный вам формат.

Это сработает для вас?

Комментарии:

1. Большое вам спасибо. В итоге я использовал элемент «latlngspan», а затем выполнил некоторое разделение строк для получения результатов. Все равно обязательно попробую другие решения в этой теме