selenium 爬取网易新闻,进入不了详情页,报 'str' object has no attribute 'click' 错误!专业人士帮忙找一下解决方案!
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
service = Service(executable_path='./chromedriver.exe') # 传入浏览器驱动路径
browser = webdriver.Chrome(service=service) # 创建浏览器对象
url = "https://news.163.com/domestic/"
browser.get(url)
# print(browser.page_source) # 获取网页源代码
time.sleep(3)
js_bottom = "document.documentElement.ScrollTop = 100000"
browser.execute_script(js_bottom) # 将网页页面滑到最底部
time.sleep(3)
more_page = browser.find_element(By.XPATH,'/html/body/div/div[3]/div[3]/div[1]/div[1]/div/a')
more_page.click() # 点击 加载更多 按钮
js_bottom = "document.documentElement.ScrollTop = 0"
browser.execute_script(js_bottom) # 将网页页面滑到最顶部
time.sleep(3)
div_list = browser.find_elements(By.XPATH,'/html/body/div/div[3]/div[3]/div[1]/div[1]/div/ul/li/div/div') # 获得标题列表
# print(div_list)
# 遍历标题
for div in div_list:
detail_page = div.find_element(By.XPATH,"./div/div[1]/h3/a").text
detail_page.click() # 报错('str' object has no attribute 'click'),进入不了详情页???
time.sleep(3)
browser.switch_to.window(browser.window_handles[1]) # 进入详情页
引用 皆我百晓生 小程序回复内容作答:
在当前代码中,detail_page
是一个字符串,是标题的文本内容,并不是一个WebElement对象,所以调用click()
方法会报错。要进入详情页,需要点击标题所在的WebElement对象。
以下是解决该问题的代码示例:
# 遍历标题
for div in div_list:
detail_page = div.find_element(By.XPATH,"./div/div[1]/h3/a")
detail_page.click() # 点击标题,进入详情页
time.sleep(3)
browser.switch_to.window(browser.window_handles[1]) # 进入详情页
【以下回答由 GPT 生成】
问题的根本原因是在循环中使用了.text
方法将元素的文本内容赋值给detail_page
变量,然后尝试对detail_page
进行点击操作,但detail_page
是一个字符串而不是一个可点击的元素对象,所以报错" 'str' object has no attribute 'click' "。
解决方案如下: 1. 首先,需要将每个详情页的URL保存下来,而不是保存文本内容。 2. 然后,打开详情页的方法需要针对保存的URL进行操作。 3. 最后,要在循环中使用try-except语句来处理可能出现的错误,以避免因为某个详情页无法打开而导致整个程序中断。
修改后的代码如下:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
service = Service(executable_path='./chromedriver') # 传入浏览器驱动路径
browser = webdriver.Chrome(service=service) # 创建浏览器对象
url = "https://news.163.com/domestic/"
browser.get(url)
# print(browser.page_source) # 获取网页源代码
time.sleep(3)
js_bottom = "document.documentElement.ScrollTop = 100000"
browser.execute_script(js_bottom) # 将网页页面滑到最底部
time.sleep(3)
more_page = browser.find_element(By.XPATH,'/html/body/div[3]/div[3]/div[1]/div[1]/div/div/a')
more_page.click() # 点击 加载更多 按钮
js_bottom = "document.documentElement.ScrollTop = 0"
browser.execute_script(js_bottom) # 将网页页面滑到最顶部
time.sleep(3)
div_list = browser.find_elements(By.XPATH,'/html/body/div[3]/div[3]/div[1]/div[1]/div/div/ul/li/div/div') # 获得标题列表
# print(div_list)
# 遍历标题
for div in div_list:
detail_url = div.find_element(By.XPATH,"./div/div[1]/h3/a").get_attribute("href")
try:
browser.get(detail_url)
time.sleep(3)
except Exception as e:
print("无法打开详情页:", e)
这样就解决了报错的问题,同时将每个详情页的URL保存下来,可以进一步处理这些URL来获取需要的信息。
请注意,此代码可能需要根据实际情况进行调整,特别是XPath表达式和等待时间的部分,以适应具体的网页结构和加载速度。