Очистка адресной информации с помощью Selenium в Python

#python #selenium #selenium-webdriver #web-scraping #selenium-chromedriver

Вопрос:

Я пытаюсь соскрести адресную информацию с https://www.smartystreets.com/products/single-address-iframe. У меня есть скрипт, который ищет данный адрес в его параметрах. Когда я смотрю на сам веб-сайт, можно увидеть различные поля, такие как Маршрут перевозчика.

Используя 3301 South Greenfield Rd Gilbert, AZ 85297 в качестве гипотетического примера, при переходе на страницу вручную можно увидеть маршрут перевозчика: R109.

Однако у меня возникли проблемы с поиском маршрута перевозчика на Селене, чтобы очистить его. Есть ли какие-либо рекомендации о том, как найти маршрут перевозчика по любому заданному адресу?

Исходный код:

 driver = webdriver.Chrome('chromedriver')
address = "3301 South Greenfield Rd Gilbert, AZ 85297n"
url = 'https://www.smartystreets.com/products/single-address-iframe'
driver.get(url)
driver.find_element_by_id("lookup-select-button").click()
driver.find_element_by_id("lookup-select").find_element_by_id("address-freeform").click()
driver.find_element_by_id("freeform-address").send_keys(address)
# Find Carrier Route here
 

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

1. Вы можете использовать только requests модуль для получения информации. Если хотите, я могу опубликовать пример.

2. Я мог бы ответить тебе, но я вижу, что ты не принимаешь ответов…. Так что, мне очень жаль

Ответ №1:

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

 from selenium import webdriver
d = webdriver.Chrome('/path/to/chromedriver')
d.get('https://www.smartystreets.com/products/single-address-iframe')
s = '3301 South Greenfield Rd Gilbert, AZ 85297'
a, a1 = s.split(' Rd ')
route = d.execute_script(f'''
   document.querySelector('#address-line1').value = '{a}'
   document.querySelector('#city').value = '{(j:=a1.split())[0][:-1]}'
   document.querySelector('#state').value = '{j[1]}'
   document.querySelector('#zip-code').value = '{j[2]}'
   document.querySelector('#submit-request').click()
   return document.querySelector('#us-street-metadata li:nth-of-type(2) .answer.col-sm-5.col-xs-3').textContent
''')
 

Выход:

 'R109'
 

Чтобы получить полное отображение всех данных параметров, вы можете использовать BeautifulSoup :

 from bs4 import BeautifulSoup as soup
... #selenium driver source here
cols = soup(d.page_source, 'html.parser').select('#us-street-output div')
data = {i.h4.text:{b.select_one('span:nth-of-type(1)').get_text(strip=True)[:-1]:b.select_one('span:nth-of-type(2)').get_text(strip=True)
         for b in i.select('ul li')} for i in cols}
print(data)
print(data['Metadata']['Congressional District'])
 

Выход:

 {'Metadata': {'Building Default': 'default', 'Carrier Route': 'R109', 'Congressional District': '05', 'Latitude': '33.291248', 'Longitude': '-111.737427', 'Coordinate Precision': 'Rooftop', 'County Name': 'Maricopa', 'County FIPS': '04013', 'eLOT Sequence': '0160', 'eLOT Sort': 'A', 'Observes DST': 'default', 'RDI': 'Commercial', 'Record Type': 'S', 'Time Zone': 'Mountain', 'ZIP Type': 'Standard'}, 'Analysis': {'Vacant': 'N', 'DPV Match Code': 'Y', 'DPV Footnotes': 'AABB', 'General Footnotes': 'L#', 'CMRA': 'N', 'EWS Match': 'default', 'LACSLink Code': 'default', 'LACSLink Indicator': 'default', 'SuiteLink Match': 'default', 'Enhanced Match': 'default'}, 'Components': {'Urbanization': 'default', 'Primary Number': '3301', 'Street Predirection': 'S', 'Street Name': 'Greenfield', 'Street Postdirection': 'default', 'Street Suffix': 'Rd', 'Secondary Designator': 'default', 'Secondary Number': 'default', 'Extra Secondary Designator': 'default', 'Extra Secondary Number': 'default', 'PMB Designator': 'default', 'PMB Number': 'default', 'City': 'Gilbert', 'Default City Name': 'Gilbert', 'State': 'AZ', 'ZIP Code': '85297', ' 4 Code': '2176', 'Delivery Point': '01', 'Check Digit': '2'}}
'05'
 

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

1. Спасибо. Это полезно. Как только вы создадите execute_script, как вы запустите его для получения выходных данных?

2. @swp1 Переданная строка d.execute_script выполняется в selenium экземпляре как Javascript. route сохраняет маршрут перевозчика, возвращенный из сценария.

3. ОК. Когда я запускаю его в своем ноутбуке Jupyter , маршрут имеет значение «по умолчанию», а не «R109». Вы знаете, почему он может это делать?

4. @swp1 В консоли разработчика вашего браузера, каков результат document.querySelector('#us-street-metadata li:nth-of-type(2) .answer.col-sm-5.col-xs-3') ? На мой взгляд разработчика, маршрут перевозчика является вторым li в us-street-metadata

5. В моем браузере это первый элемент метаданных (самый левый столбец). Результатом этого является «по умолчанию». Есть ли способ найти гипотетическую переменную? Допустим, вы назначаете строку, называемую столбцом, в качестве значения, которое вы ищете. Поэтому, если столбец «Маршрут перевозчика», он находит маршрут перевозчика; если столбец «Округ Конгресса», он находит округ Конгресса и так далее.

Ответ №2:

Ajax1234, вот код и скриншот, которые вы просили:

введите описание изображения здесь

введите описание изображения здесь