Selenium & Python, получите потомок динамического src при использовании XPATH - PullRequest
0 голосов
/ 30 октября 2018

У меня есть HTML, который я хочу очистить.

<div class="prw_rup prw_common_static_map_no_style staticMap" data-prwidget-name="common_static_map_no_style" data-prwidget-init="handlers">
    <div class="prv_map clickable" onclick="requireCallLast('ta/maps/opener', 'open', 2, null, null,{customFilters: []})">
         <img width="310" style="width:310px;height:270px;" id="lazyload_-1295083988_4" height="270" src="https://trip-raster.citymaps.io/staticmap?scale=2&amp;zoom=18&amp;size=310x270&amp;language=en&amp;center=32.769936,-117.252693&amp;markers=icon:http%3A%2F%2Fc1.tacdn.com%2Fimg2%2Fmaps%2Ficons%2Fpin_v2_CurrentCenter.png|32.769936,-117.25269&amp;markers=icon:http%3A%2F%2Fc1.tacdn.com%2Fimg2%2Fmaps%2Ficons%2Fpin_lg_Restaurant.png|32.769936,-117.25269|32.770027,-117.25272&amp;markers=icon:http%3A%2F%2Fc1.tacdn.com%2Fimg2%2Fmaps%2Ficons%2Fpin_lg_ThingToDo.png|32.77055,-117.25273|32.770683,-117.251884|32.770664,-117.25131">
    </div>
</div>

Как получить src дочернего элемента div? То есть я хочу вернуть URL-адрес в виде строки.

Пока что, самое близкое, что я могу получить к этому.

try:
    mappa = driver.find_element_by_xpath("""//*[@id="taplc_location_detail_overview_restaurant_0"]/div[1]/div[2]/div[1]/div""") # .get_attribute("src")
    print(mappa, "this is mappa")
    child_mappa = mappa.find_element_by_xpath('.//*').get_attribute("src")
    print(child_mappa)

, что дает:

$ <selenium.webdriver.remote.webelement.WebElement (session="4c6acf0a93bc9c184a351ddbc2180977", element="0.5263477154236882-1")> 
$ https://static.tacdn.com/img2/x.gif

Поскольку идентификатор является динамическим, я не могу использовать его для захвата xpath. поскольку xpath связан с этим идентификатором. Кроме того, почему этот SRC изменился?

Как получить этот источник?

1 Ответ

0 голосов
/ 30 октября 2018

Итак, это немного шатко, но мне удалось получить его с помощью регулярных выражений. Вместо того, чтобы брать его с селеном, я читаю все html, ищу ссылки с регулярным выражением и делю их там, где мне это нужно.

Это не чисто, но работает.

    driver.get(url)
    innerHTML = driver.execute_script("return document.body.innerHTML")
    print(type(innerHTML))

    try:
        urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', innerHTML)
        #print(urls)
        for page_url in urls:
            if 'staticmap?scale=' in page_url:
                map_click = page_url.split('language=en&center=')[1].split('&markers=icon:http')[0]
                lat, long = map_click.split(',')
                break
    except:
        lat, long = None, None
...