selenium用try-except处理抓取异常(新闻抓取案例三)

今天练习的是新闻内容局部抓取,不需要打印全文,只需要打印前面两三段,所以可以直接定位到前三段的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")

猜你喜欢

转载自blog.csdn.net/qq_43251443/article/details/82833092