как найти ссылку на эпизод среди многих эпизодов в селене - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь написать код с селеном python. Я работаю на сайте, как https://www.thewatchcartoononline.tv/anime/south-park-season-1. Как видите, эта страница является страницей сериала со ссылками на все эпизоды сериала. Я хочу получить ссылку на данный эпизод (пользователь выбирает, какой из них).

Важно отметить, что не каждая страница серии имеет одинаковый формат именования для эпизодов, в некоторых сериях есть только «Эпизод 1» в текст ссылки, другие могут иметь в ссылке «эпизод 1 Южного парка 1», поэтому я не могу рассчитывать на формат имен текста ссылки.

это код, который я использовал для получения ссылки на эпизод (episode_num предоставляется пользователем)

episode_num = 1
chrome_driver = Chrome()
chrome_driver.get("https://www.thewatchcartoononline.tv/anime/south-park-season-1")
# This xpath takes you to the div of the episode list and then it search for a link which has a certain text in it
links = chrome_driver.find_elements_by_xpath(
            f"//*[@id='sidebar_right3']//"
            f"a[contains(text(), 'Episode {episode_num}')]"
        )

Однако, когда я проверяю links, я вижу, что существует более одной ссылки. Я получаю и эпизод 1, и эпизод 10 (поскольку оба они содержат строку «Эпизод 1»). Можно ли получить только нужную ссылку? (возможно, чтобы заставить селен взять ссылку, которая не имеет никакого ди git после текста, который я хочу)

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Попробуйте выполнить xpath .Используйте опцию last (), это должно дать счет 1.

links = chrome_driver.find_elements_by_xpath("(//*[@id='sidebar_right3']//a[contains(text(), 'Episode {episode_num}')])[last()]")
print(len(links))
0 голосов
/ 30 марта 2020

РЕДАКТИРОВАТЬ:

Ну, уродливо, но в Xpath 1.0 я думаю, что это лучшее, что вы можете сделать.

links = chrome_driver.find_elements_by_xpath(f"//*[@id='sidebar_right3']//a[(contains(., 'Episode {episode_num} ')) or (substring(text(), string-length(text()) - string-length('Episode {episode_num}') +1) = 'Episode {episode_num}') or (contains(., 'Episode {episode_num}-')) ]")

Находит Эпизод 10-11 для episode_num = 10, но не для episode_num = 11.

Проверяет:

  • - Episode x в text()
  • text() заканчивается Episode x
  • , равным Episode x- в text()

Я проверял URL-адреса эпизодов. Не лучше ли было бы полагаться на @href вместо text()? Это немного короче:

links = chrome_driver.find_elements_by_xpath(f"//*[@id='sidebar_right3']//a[(contains(@href, 'episode-{episode_num}-')) or (substring(@href, string-length(@href) - string-length('episode-{episode_num}') +1) = 'episode-{episode_num}')]")

Проверяет:

  • is episode-x- в URL
  • URL заканчивается episode-x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...