今天练习的是新闻内容局部抓取,不需要打印全文,只需要打印前面两三段,所以可以直接定位到前三段的p标签
content1=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[1]").text
content2=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[2]").text
content3=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[3]").text
但是实际抓取的时候有一篇文章报错了,因为它很短,没有第三段——selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:
于是想到能不能用try-except来处理异常,判断有没有第三段。查了一下确实有这个异常NoSuchElementException,要用到这个NoSuchElementException异常,要在开头导入from selenium.common.exceptions import NoSuchElementException。
如果没有第三段,也就是说p[3]不存在,那就只打印第一和第二段,如果没有异常,则打印前三段:
try:
content3=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[3]").text
except NoSuchElementException: #如果没有第三段,出现了NoSuchElementException异常,就只打印第一和第二段。
print(content1,content2)
else:
print(content1,content2,content3)
完整代码如下:
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time
driver=webdriver.Chrome()
driver.get("http://news.cnpc.com.cn/hynews/")
time.sleep(1)
links=driver.find_elements_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[2]/div[2]/div/ul/*/a")
length=len(links)
for i in range(0,21): #抓取太多旧的没意义,抓取20条足够了
links=driver.find_elements_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[2]/div[2]/div/ul/*/a")
link=links[i]
link.click()
time.sleep(1)
handles=driver.window_handles
index_handle=driver.current_window_handle
for handle in handles:
if handle != index_handle:
driver.switch_to.window(handle)
else:
continue
title=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[2]/h2/a").text
print(i+1,title)
content1=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[1]").text #只抓取前一两段
content2=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[2]").text
try:
content3=driver.find_element_by_xpath("//*[@id='newsmain-ej']/div/div[1]/div[1]/div[4]/div/p[3]").text
except NoSuchElementException:
print(content1,content2)
else:
print(content1,content2,content3)
print("\n")
driver.close()
time.sleep(1)
driver.switch_to_window(index_handle)
print("————中石油抓取完毕,共20条新闻————")
print("\n")