使用 python selenium 从 href 中检索值
Retriving value from href using python selenium
<a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/channel/UC8butISFwT-Wl7EV0hUK0BQ" dir="auto">freeCodeCamp.org</a>
我是 selenium 的新手,正在尝试制作一个 YouTube 排名检查机器人!
我试图从这里获取 href 值,以便我可以将它与频道名称进行比较并打印出正确的排名数字,但我得到的输出不正确。
我得到的输出是 2,5,而我应该得到 6,7。
谁能告诉我where/what我做错了吗?可以做些什么来解决这个问题?提前致谢
下面附上截图以查看排名
from selenium import webdriver
import time
channel_name = 'freeCodeCamp.org' #channel name
driver = webdriver.Chrome(r"C:\Users\user\PycharmProjects\YoutubeRankCheckBot\Drivers\chromedriver.exe")
driver.get("http://youtube.com")
driver.maximize_window()
search_bar = driver.find_element_by_id("search")
search_bar.send_keys("React JS") #Inserting text input in a automation way
search_button = driver.find_element_by_id("search-icon-legacy")
search_button.click()
time.sleep(5)
video_list = driver.find_elements_by_xpath('//a[contains(@href,"/channel/UC8butISFwT-Wl7EV0hUK0BQ")]')
print(video_list)
for index, channel in enumerate(video_list):
if channel.text == channel_name:
print(index)
您使用了错误的定位器。
试试这个:
video_list = driver.find_elements_by_xpath("//div[@id='channel-info']//a[@class='yt-simple-endpoint style-scope yt-formatted-string']")
UPD
经过你的解释,我明白了一些。
您可以通过以下方式找到这些特定元素:
//div[@id='channel-info']//a[@class='yt-simple-endpoint style-scope yt-formatted-string' and (contains(@href,"/channel/UC8butISFwT-Wl7EV0hUK0BQ"))]
这将为您提供 2 个元素,因为该搜索结果中有来自该频道的 2 个视频
video_list = driver.find_elements_by_xpath('//a[@class="style-scope ytd-video-renderer"]')
video_url = [video_list.get_attribute('href').replace('https://www.youtube.com', '') for video_list in video_list]
print(video_url)
for index, channel in enumerate(video_url):
if channel == channel_id:
print(index)
此处channel_id
只不过是频道名称freeCodeCamp.org
的/channel/UC8butISFwT-Wl7EV0hUK0BQ
。
- 第一行给出
a
标签的所有元素
- 从第 1 步的列表中,找到
href
元素。它会给你完整的 URL 例如https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ
。所以替换 https://www.youtube.com
并提取到 video_url
- 枚举
video_url
并打印 index
<a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/channel/UC8butISFwT-Wl7EV0hUK0BQ" dir="auto">freeCodeCamp.org</a>
我是 selenium 的新手,正在尝试制作一个 YouTube 排名检查机器人! 我试图从这里获取 href 值,以便我可以将它与频道名称进行比较并打印出正确的排名数字,但我得到的输出不正确。 我得到的输出是 2,5,而我应该得到 6,7。
谁能告诉我where/what我做错了吗?可以做些什么来解决这个问题?提前致谢
下面附上截图以查看排名
from selenium import webdriver
import time
channel_name = 'freeCodeCamp.org' #channel name
driver = webdriver.Chrome(r"C:\Users\user\PycharmProjects\YoutubeRankCheckBot\Drivers\chromedriver.exe")
driver.get("http://youtube.com")
driver.maximize_window()
search_bar = driver.find_element_by_id("search")
search_bar.send_keys("React JS") #Inserting text input in a automation way
search_button = driver.find_element_by_id("search-icon-legacy")
search_button.click()
time.sleep(5)
video_list = driver.find_elements_by_xpath('//a[contains(@href,"/channel/UC8butISFwT-Wl7EV0hUK0BQ")]')
print(video_list)
for index, channel in enumerate(video_list):
if channel.text == channel_name:
print(index)
您使用了错误的定位器。
试试这个:
video_list = driver.find_elements_by_xpath("//div[@id='channel-info']//a[@class='yt-simple-endpoint style-scope yt-formatted-string']")
UPD
经过你的解释,我明白了一些。
您可以通过以下方式找到这些特定元素:
//div[@id='channel-info']//a[@class='yt-simple-endpoint style-scope yt-formatted-string' and (contains(@href,"/channel/UC8butISFwT-Wl7EV0hUK0BQ"))]
这将为您提供 2 个元素,因为该搜索结果中有来自该频道的 2 个视频
video_list = driver.find_elements_by_xpath('//a[@class="style-scope ytd-video-renderer"]')
video_url = [video_list.get_attribute('href').replace('https://www.youtube.com', '') for video_list in video_list]
print(video_url)
for index, channel in enumerate(video_url):
if channel == channel_id:
print(index)
此处channel_id
只不过是频道名称freeCodeCamp.org
的/channel/UC8butISFwT-Wl7EV0hUK0BQ
。
- 第一行给出
a
标签的所有元素 - 从第 1 步的列表中,找到
href
元素。它会给你完整的 URL 例如https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ
。所以替换https://www.youtube.com
并提取到video_url
- 枚举
video_url
并打印index