Я пытаюсь очистить посты в 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.
Наконец, после стольких проб и ошибок, я обнаружил, что эти два изменения являются решением.
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».
Дракончик. Пока у кого-то не будет лучшего и более оптимизированного ответа, я сначала приму этот.