我正在嘗試在 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)
這也不起作用,我遇到了同樣的錯誤。
uj5u.com熱心網友回復:
你的第一次嘗試
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 個類屬性值。為了使上述運算式有效,您必須.
在每個運算式之前放置一個點,因為在 CSS Selector 中.
,值之前的一個點表示這是一個類名。- 因此,這
yt-formatted-string.style-scope.ytd-video-primary-info-renderer
將是一個正確的 CSS 選擇器,但是當您要訪問第二個元素時,它將匹配該頁面上的 3 個元素。
您可以使用find_elements_by_css_selector
方法執行此操作,訪問串列中的第二個元素。 - 您必須從 web 元素中提取文本
因此,要使用第一種方法獲取 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401193.html
上一篇:如何在使用async而不是inline_requests時在parse方法中發出post請求?
下一篇:串列轉換為空白資料框