在 Selenium 中打印 Youtube 视频标题
Printing Youtube video title in Selenium
我正在尝试在 Selenium 中打印 YouTube 视频的标题。我尝试了 3 种不同的方法,但只有一种方法有效。所以我只想知道为什么其他方法不起作用。
我的第一次尝试:
videoTitle = driver.find_element_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")
print(videoTitle)
这没有用,错误是:
File "C:\Users\forre\IdeaProjects\PythonNotes\Packages\Selenium\Web_Scraping.py", line 21, in <module>
videoTitle = driver.find_element_by_xpath("/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string")
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 520, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1244, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string"}
(Session info: chrome=96.0.4664.110)
Stacktrace:
Backtrace:
Ordinal0 [0x002C6903+2517251]
Ordinal0 [0x0025F8E1+2095329]
Ordinal0 [0x00162848+1058888]
Ordinal0 [0x0018D448+1233992]
Ordinal0 [0x0018D63B+1234491]
Ordinal0 [0x001B7812+1406994]
Ordinal0 [0x001A650A+1336586]
Ordinal0 [0x001B5BBF+1399743]
Ordinal0 [0x001A639B+1336219]
Ordinal0 [0x001827A7+1189799]
Ordinal0 [0x00183609+1193481]
GetHandleVerifier [0x00455904+1577972]
GetHandleVerifier [0x00500B97+2279047]
GetHandleVerifier [0x00356D09+534521]
GetHandleVerifier [0x00355DB9+530601]
Ordinal0 [0x00264FF9+2117625]
Ordinal0 [0x002698A8+2136232]
Ordinal0 [0x002699E2+2136546]
Ordinal0 [0x00273541+2176321]
BaseThreadInitThunk [0x76136739+25]
RtlGetFullPathName_UEx [0x77D78AFF+1215]
RtlGetFullPathName_UEx [0x77D78ACD+1165]
(No symbol) [0x00000000]
Process finished with exit code 1
我的第二次尝试:
videoTitle = driver.find_element_by_xpath("/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string")
print(videoTitle)
这也没有用,我得到了同样的错误。
你第一次尝试
videoTitle = driver.find_element_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")
有 3 个问题:
yt-formatted-string.style-scope ytd-video-primary-info-renderer
不是该元素的有效 CSS 选择器。 2 个字符串 style-scope
和 ytd-video-primary-info-renderer
是 2 个 class 属性值。要使上述表达式有效,您必须在每个表达式之前放置一个点 .
,因为在 CSS 选择器中,一个值前的点 .
表示这是一个 class 名称.
- 因此,
yt-formatted-string.style-scope.ytd-video-primary-info-renderer
将是一个正确的 CSS 选择器,但是它会匹配该页面上的 3 个元素,而您想要访问第二个元素。
您可以使用 find_elements_by_css_selector
方法执行此操作,访问列表中的第二个元素。
- 您必须从网络元素中提取文本
因此,要使用第一种方法获取 YouTube 视频标题,您的代码应该是:
videoTitle = driver.find_elements_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")[1].text
至于 /html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string
- 您正在尝试使用绝对 XPath 表达式。这种定位器极其脆弱。我尝试使用它,但无法与此定位器匹配。
您应该了解如何创建正确的 XPath 定位器。
例如,这将是正确的 XPath 定位器:
"//h1//*[@class='style-scope ytd-video-primary-info-renderer']"
所以这会起作用:
videoTitle = driver.find_element_by_xpath("//h1//*[@class='style-scope ytd-video-primary-info-renderer']").text
print(videoTitle)
我正在尝试在 Selenium 中打印 YouTube 视频的标题。我尝试了 3 种不同的方法,但只有一种方法有效。所以我只想知道为什么其他方法不起作用。
我的第一次尝试:
videoTitle = driver.find_element_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")
print(videoTitle)
这没有用,错误是:
File "C:\Users\forre\IdeaProjects\PythonNotes\Packages\Selenium\Web_Scraping.py", line 21, in <module>
videoTitle = driver.find_element_by_xpath("/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string")
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 520, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1244, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:\Users\forre\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string"}
(Session info: chrome=96.0.4664.110)
Stacktrace:
Backtrace:
Ordinal0 [0x002C6903+2517251]
Ordinal0 [0x0025F8E1+2095329]
Ordinal0 [0x00162848+1058888]
Ordinal0 [0x0018D448+1233992]
Ordinal0 [0x0018D63B+1234491]
Ordinal0 [0x001B7812+1406994]
Ordinal0 [0x001A650A+1336586]
Ordinal0 [0x001B5BBF+1399743]
Ordinal0 [0x001A639B+1336219]
Ordinal0 [0x001827A7+1189799]
Ordinal0 [0x00183609+1193481]
GetHandleVerifier [0x00455904+1577972]
GetHandleVerifier [0x00500B97+2279047]
GetHandleVerifier [0x00356D09+534521]
GetHandleVerifier [0x00355DB9+530601]
Ordinal0 [0x00264FF9+2117625]
Ordinal0 [0x002698A8+2136232]
Ordinal0 [0x002699E2+2136546]
Ordinal0 [0x00273541+2176321]
BaseThreadInitThunk [0x76136739+25]
RtlGetFullPathName_UEx [0x77D78AFF+1215]
RtlGetFullPathName_UEx [0x77D78ACD+1165]
(No symbol) [0x00000000]
Process finished with exit code 1
我的第二次尝试:
videoTitle = driver.find_element_by_xpath("/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string")
print(videoTitle)
这也没有用,我得到了同样的错误。
你第一次尝试
videoTitle = driver.find_element_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")
有 3 个问题:
yt-formatted-string.style-scope ytd-video-primary-info-renderer
不是该元素的有效 CSS 选择器。 2 个字符串style-scope
和ytd-video-primary-info-renderer
是 2 个 class 属性值。要使上述表达式有效,您必须在每个表达式之前放置一个点.
,因为在 CSS 选择器中,一个值前的点.
表示这是一个 class 名称.- 因此,
yt-formatted-string.style-scope.ytd-video-primary-info-renderer
将是一个正确的 CSS 选择器,但是它会匹配该页面上的 3 个元素,而您想要访问第二个元素。
您可以使用find_elements_by_css_selector
方法执行此操作,访问列表中的第二个元素。 - 您必须从网络元素中提取文本
因此,要使用第一种方法获取 YouTube 视频标题,您的代码应该是:
videoTitle = driver.find_elements_by_css_selector("yt-formatted-string.style-scope ytd-video-primary-info-renderer")[1].text
至于 /html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[5]/div[1]/div/div[8]/div[2]/ytd-video-primary-info-renderer/div/h1/yt-formatted-string
- 您正在尝试使用绝对 XPath 表达式。这种定位器极其脆弱。我尝试使用它,但无法与此定位器匹配。
您应该了解如何创建正确的 XPath 定位器。
例如,这将是正确的 XPath 定位器:
"//h1//*[@class='style-scope ytd-video-primary-info-renderer']"
所以这会起作用:
videoTitle = driver.find_element_by_xpath("//h1//*[@class='style-scope ytd-video-primary-info-renderer']").text
print(videoTitle)