Я не могу получить атрибут href из элемента комментария Instagram, используя Selenium Webdriver для Python

Я пытаюсь очистить посты в Instagram от последнего поста и следующих постов в течение установленного времени под этим дескриптором. Тем не менее, я не совсем понимаю HTML и не могу закончить обучение вовремя, потому что мне нужно это сделать быстро.

Я хочу очистить атрибуты href каждого комментария и ответов, чтобы получить его уникальный идентификатор комментария, чтобы предотвратить дублирование для дальнейшего анализа и перекрестной проверки. Я пытался использовать CLASS_NAME, XPATH и CSS_SELECTOR, и ни один из них не работал в мою пользу.

Это элемент, который я хочу получить: элемент, который я хочу очистить

Мой код как-то зачищен только [instagram_url]/p/CqhlzLmpfKV/#, а не полный [instagram_url]/p/CqhlzLmpfKV/c/17979860159080809/ (основной комментарий) или [instagram_url]/p/CqhlzLmpfKV/c/17979860159080809/r/18078377977318895/ (ответ на основной комментарий).

Это мой текущий код:

driver.get("https://www.instagram.com/weareone.exo/")

latest_post = WebDriverWait(driver, timeout=40).until(lambda d: d.find_element(By.CLASS_NAME,"_aabd"))
latest_post.click()

comment_ids = []

load_more_path = "/html/body/div[2]/div/div/div[2]/div/div/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/div[1]/ul/li/div"


# "Load more comments" until 2 clicks
while i<3:
    try:
        WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.XPATH, load_more_path))).click()
        time.sleep(1.42)
                
    except:
        print("No more 'LOAD MORE COMMENTS' button to be clicked")
        break
    
# "View Replies" if there's any
view_reply_path = 'li > ul > li > div > button[class = "_acan _acao _acas _aj1-"]'

WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, view_reply_path)))
view_reply_buttons = driver.find_elements(By.CSS_SELECTOR, view_reply_path)

for button in range(len(view_reply_buttons)):
    view_reply_buttons[button].click()
    time.sleep(1.32)

time.sleep(5.8)
comment = driver.find_elements(By.CLASS_NAME, "_a9zj")

for c in comment:
    container = c.find_element(By.CLASS_NAME,'_a9zr')

    WebDriverWait(driver, timeout=20).until(EC.element_to_be_clickable((By.XPATH, '//div[2]/div/a')))
    commentid = c.find_element(By.XPATH, '//div[2]/div/a').get_attribute("href")
  
    comment_ids.append(commentid)

    print(commentid)

Тогда вывод моего кода выше: (я пропустил полный URL-адрес instagram из вывода, так как стек не примет вопрос таким образом)

[instagram_url]/p/CqhlzLmpfKV/# 
[instagram_url]/p/CqhlzLmpfKV/# 
[instagram_url]/p/CqhlzLmpfKV/#
..
..
..
[instagram_url]/p/CqhlzLmpfKV/# 
[instagram_url]/p/CqhlzLmpfKV/# 
[instagram_url]/p/CqhlzLmpfKV/#

Любая помощь приветствуется! Заранее спасибо.

🤔 А знаете ли вы, что...
В Python можно легко работать с базами данных, такими как SQLite и MySQL.


84
1

Ответ:

Решено

Наконец, после стольких проб и ошибок, я обнаружил, что эти два изменения являются решением.

comment = driver.find_elements(By.XPATH, '//ul[@class = "_a9ym"]/div/li/div[@class = "_a9zm"]')

и

commentid = c.find_element(By.XPATH, ".//a[@role='link' and .//time[contains(@class,'_a9ze _a9zf')]]").get_attribute("href")

Объяснение: Оказалось, что мой старый код с именем класса и xpath выше также очистил заголовок сообщения. В заголовке нет атрибута href внутри временной метки, поэтому он выдавал мне сообщения об ошибках. Кроме того, я должен ссылаться на элементы ниже тега «a», так как я просто не могу очистить его, если я ссылаюсь на элементы выше тега «a».

Дракончик. Пока у кого-то не будет лучшего и более оптимизированного ответа, я сначала приму этот.