【问题标题】:Scraping Address Information Using Selenium in Python在 Python 中使用 Selenium 抓取地址信息
【发布时间】:2021-11-05 11:30:42
【问题描述】:

我正在尝试从https://www.smartystreets.com/products/single-address-iframe 中抓取地址信息。我有一个在其参数中搜索给定地址的脚本。当我查看网站本身时,可以看到诸如 Carrier Route 之类的各个字段。

以 3301 South Greenfield Rd Gilbert, AZ 85297 为例,当手动进入该页面时,可以看到 Carrier Route:R109。

但是,我很难在 Selenium 上找到载体路线来抓取它。对于如何找到任何给定地址的运营商路线有什么建议吗?

起始代码:

driver = webdriver.Chrome('chromedriver')
address = "3301 South Greenfield Rd Gilbert, AZ 85297\n"
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

【问题讨论】:

  • 您可以只使用requests 模块来获取信息。如果你愿意,我可以发布示例。
  • 我可以回答你,但我看到你不接受答案......所以,我很抱歉

标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


【解决方案1】:

Ajax1234,这是您要求的代码和屏幕截图:

【讨论】:

    【解决方案2】:

    您可以使用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'
    

    【讨论】:

    • 谢谢。这很有帮助。创建 execute_script 后,如何运行它来生成输出?
    • @swp1 传递给d.execute_script 的字符串在selenium 实例中作为Javascript 执行。 route 存储从脚本返回的运营商路线。
    • 好的。当我在 Jupyter notebook 中运行它时,路由是值“默认”而不是“R109”。你知道它为什么会这样吗?
    • @swp1 在浏览器的开发者控制台中,document.querySelector('#us-street-metadata li:nth-of-type(2) .answer.col-sm-5.col-xs-3') 的结果是什么?在我的开发者看来,运营商路线是us-street-metadata中的第二个li
    • 在我的浏览器中,它是元数据中的第一项(最左边的列)。结果是“默认”。有没有办法找到一个假设变量?假设您分配了一个名为 column 的字符串作为您要查找的值。因此,如果列是“承运人路线”,它会找到承运人路线;如果列为“国会选区”,则查找国会选区,依此类推。
    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多