#113. isbn号码

#113. isbn号码

题目描述

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。识别码的计算方法如下:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对0670821629个数字,从左至右,分别乘以12...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

这一题主要思路就是用上字符串,然后进行强模拟。题目大体比较简单,但是。。。。。。和其他字符串类型题目一样,套路太多!!!

   首先是输入,再是进行计算,都还算“简单”?(不存在的)!

眼瞎的我没看到还要分别乘19再求和,结果BOOOOON!!!

脑残的我不知道还要先从字符串T[0]开始处理,结果BOOOOON!!!

智障的我没想到还要累加s 后还要mod 11,结果BOOOOON!!!

白痴的我不晓得还有余数等于0这回事,结果BOOOOON!!!

一次次落入坑中的我再一次从地雷堆中爬了出来,拿了50

额。。。怎么是50 ???一脸懵逼?

原来T[12]等于X后执行了两次操作,掀桌!

加上了“return 0”之后终于满血复活。。。。。。

废话少说,上代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

     int s=0,i;

     string t;

     cin>>t;

     s+=int(t[0]-'0')*1;

     s+=int(t[2]-'0')*2;

     s+=int(t[3]-'0')*3;

     s+=int(t[4]-'0')*4;

     s+=int(t[6]-'0')*5;

     s+=int(t[7]-'0')*6;

     s+=int(t[8]-'0')*7;

     s+=int(t[9]-'0')*8;

     s+=int(t[10]-'0')*9;

     s=s%11;

     if(s==10&&t[12]=='X')

     {

        cout<<"Right"<<endl;

         return 0;

    }

     if(s==10&&t[12]!='X')

     {

         for(i=0;i<=11;i++)cout<<t[i];

        cout<<'X'<<endl;

         return 0;

    }

    if(s==int(t[12]-'0'))cout<<"Right"<<endl;

    if(s!=int(t[12]-'0'))

     {

         for(i=0;i<=11;i++)cout<<t[i];

        cout<<s<<endl;

    }

}

啊,就是辣么帅

from selenium import webdriver from selenium.webdriver.common.by import By import time #WebDriver对象常用的属性和方法 #close() 关闭选项卡 #quit() 退出浏览器 #edge.set_window_size(width,height) 设置浏览器的大小 #maximize_window() 最大化窗口 #minimize_window() 最小化窗口 #back() 后退 #forward() 前进 #refresh() 刷新页面 #get_screenshot_as_file(filename) 把当前窗口截图并保存到filename #page_source 得到渲染后的页面代开发者工具中元素选项卡下的内容一样 #find_element(by,value) 得到一个WebElement对象 # by选择元素的方法 by=By. # By.CLASS_NAME class类名 # By.ID id属性 # By.LINK_TEXT 链接文本 # By.TAG_NAME 标签名 # By.XPATH xpath路径 # By.CSS_SELECTOR css选择器 # By.PARTIAL_LINK_TEXT 部分链接文本 # By.NAME 名称 # value值 #find_elements(by,value) 参数含义find_element,得到的结果是list对象,其元素是WebElement对象 #window_handles 当前浏览器的选项卡句柄 #switch_to.window() 切换到哪个句柄窗口 #WebElement对象的常用属性和方法 #find_element,find_elements 同上 #clear() 清空输入框、文本域中的内容 #tag_name 标签的名称 #click() 模拟鼠标单击操作 #text 元素的文本内容 #get_attribute(name) 获取元素name属性的值 #size 元素的大小 #screenshot(filename) 对元素进行截图并保存 #js = "window.open(&#39;about:blank&#39;)" #el = edge.find_element(by=By.ID,value=&#39;newBook&#39;) # els #=edge.find_elements(by=By.XPATH,value=&#39;//*[@id="newBook"]/div/div[3]//a&#39;) # el= els[0] # el.screenshot(&#39;./spider/el.png&#39;) #edge.refresh() #获取人民邮电出版社新书推荐下电子栏目中书的 书名、作者、价格 edge = webdriver.Edge() url = &#39;https://www.ptpress.com.cn/&#39; edge.get(url) edge.maximize_window() el = edge.find_element(by=By.XPATH,value=&#39;//div[@id="newBook"]/div/div[2]/span&#39;) print(el.text) el.click() time.sleep(2) books = [] #用来保存结果的 booka = edge.find_elements(by=By.XPATH,value=&#39;//*[@id="newBook"]/div/div[3]//a&#39;) for a in booka: book = {} a.click() whs = edge.window_handles #获取当前浏览器选项卡 edge.switch_to.window(whs[-1]) #切换到新的选项卡 time.sleep(8) #等待数据加载 book[&#39;name&#39;] = edge.find_element(by=By.CLASS_NAME,value="book-name").text book[&#39;price&#39;] = edge.find_element(by=By.CLASS_NAME,value=&#39;price&#39;).text book[&#39;author&#39;] = edge.find_element(by=By.CLASS_NAME,value=&#39;book-author&#39;).text books.append(book) edge.close() edge.switch_to.window(whs[0]) print(books) #作业:获取两个类别的新书推荐书籍信息:书名、作者、价格,ISBN input()
最新发布
05-28
<think>好的,我现在需要解决用户的问题:如何使用Selenium抓取网页中的书名、作者、价格等信息并实现多窗口切换。首先,我得回顾用户提供的引用内容,看看有没有相关的代示例或者方法可以参考。用户给出的引用中有几个Selenium的示例,比如引用[1]展示了基本的Selenium操作,包括启动浏览器、定位元素、输入文本、点击按钮等。引用[3]则提到了如何定位和操作单选按钮,使用XPath来查找元素。这些可能对定位书名、作者等元素有帮助。另外,引用[4]提到了在爬虫中使用循环和迭代器处理数据,这可能涉及到数据提取和存储的部分。 接下来,我需要考虑如何抓取多个信息。通常,网页上的信息会以结构化的方式呈现,比如每个书籍信息可能在一个容器元素内,包含书名、作者、价格的子元素。我需要先定位这些容器元素,然后逐个提取其中的数据。例如,使用find_elements(By.CLASS_NAME, &#39;book-item&#39;)找到所有书籍项,再在每个项中使用find_element(By.CLASS_NAME,&#39;title&#39;)获取书名等。 然后是窗口切换的问题。当点击某个链接可能会打开新窗口时,Selenium需要切换到新窗口才能操作其中的元素。引用中没有直接提到窗口切换,但根据Selenium的知识,可以使用driver.window_handles获取所有窗口句柄,然后切换到新窗口。例如,获取当前所有窗口句柄,找到新打开的窗口,然后driver.switch_to.window(handle)进行切换。处理完后再切换回原窗口。接下来,我需要确保代示例的正确性。例如,启动浏览器、定位元素的方法是否正确。引用[1]中使用了By.ID和send_keys,而引用[3]使用了XPath定位,这些方法都可以用于不同场景。可能需要结合CSS选择器或XPath来定位元素,具体取决于网页结构。另外,用户可能需要处理动态加载的内容,比如通过执行JavaScript滚动页面(如引用[1]中的execute_script),或者等待元素出现。这里可能需要显式等待,比如WebDriverWait配合expected_conditions,确保元素加载完成后再进行操作。 最后,数据存储部分,可能需要将提取的数据保存到列表或字典中,然后写入文件,比如CSV或JSON。这部分在引用中没有详细说明,但用户可能需要示例代来展示如何存储数据。总结步骤:1.启动浏览器,访问目标网页。2.定位书籍信息的容器元素,遍历每个容器。3.在每个容器中提取书名、作者、价格等信息。4.处理可能的新窗口切换,例如点击某个链接后切换到新窗口获取数据,再关闭并返回原窗口。5.使用显式等待处理动态加载的内容。6.存储提取的数据到文件。需要注意的点: -元素定位的准确性,可能需要查看网页的HTML结构,调整选择器。-窗口切换时的句柄管理,避免切换到错误的窗口。 -异常处理,比如元素未找到时的处理,避免程序崩溃。 -数据存储的格式和方式,根据用户需求选择合适的格式。现在需要将这些步骤转化为具体的代示例,并解释每一步的作用,同时确保符合用户的要求,比如多窗口切换的实现。同时,生成相关问题,帮助用户进一步深入学习。</think>### 使用Selenium抓取网页数据及多窗口切换方法 #### 一、数据抓取步骤示例 1. **初始化浏览器并打开目标页面** ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://example-bookstore.com") ``` 2. **定位数据容器并提取信息** 假设每本书的信息包裹在`<div class="book-item">`中: ```python books = driver.find_elements(By.CLASS_NAME, &#39;book-item&#39;) data = [] for book in books: title = book.find_element(By.CSS_SELECTOR, &#39;.title&#39;).text author = book.find_element(By.CLASS_NAME, &#39;author&#39;).text price = book.find_element(By.XPATH, &#39;.//span[@data-role="price"]&#39;).text data.append({"书名": title, "作者": author, "价格": price}) ``` 3. **处理多窗口切换** 当点击链接触发新窗口时: ```python # 点击打开新窗口的链接 original_window = driver.current_window_handle driver.find_element(By.LINK_TEXT, "查看详情").click() # 等待新窗口出现并切换 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) new_window = [window for window in driver.window_handles if window != original_window][0] driver.switch_to.window(new_window) # 在新窗口提取数据 detail_title = driver.find_element(By.TAG_NAME, &#39;h1&#39;).text print(f"详情页标题:{detail_title}") # 关闭新窗口并返回原窗口 driver.close() driver.switch_to.window(original_window) ``` 4. **数据存储(CSV格式)** ```python import csv with open(&#39;books.csv&#39;, &#39;w&#39;, newline=&#39;&#39;, encoding=&#39;utf-8&#39;) as f: writer = csv.DictWriter(f, fieldnames=["书名", "作者", "价格"]) writer.writeheader() writer.writerows(data) ``` #### 二、关键技巧说明 1. **元素定位优化** - 优先使用`CSS_SELECTOR`和`CLASS_NAME`定位 - 复杂结构可用`XPath`,如:`//div[contains(@class,&#39;price-box&#39;)]` - 显式等待避免元素未加载错误: ```python WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "main-content")) ) ``` 2. **窗口管理注意事项** - 使用`driver.current_window_handle`记录原始窗口 - 通过`driver.window_handles`差异识别新窗口 - 切换后必须验证页面加载完成 3. **反爬虫应对** - 添加随机延迟:`time.sleep(random.uniform(1,3))` - 使用`user-agent`伪装: ```python options = webdriver.ChromeOptions() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...") ``` #### 三、完整案例演示 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import csv import time driver = webdriver.Chrome() driver.get("https://bookstore.example/list") try: # 等待列表加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "book-item")) ) # 提取第一页数据 books = driver.find_elements(By.CLASS_NAME, &#39;book-item&#39;) book_data = [] for index, book in enumerate(books): # 提取基础信息 title = book.find_element(By.CSS_SELECTOR, &#39;h2.title&#39;).text author = book.find_element(By.CLASS_NAME, &#39;author&#39;).text price = book.find_element(By.XPATH, &#39;.//meta[@itemprop="price"]&#39;).get_attribute(&#39;content&#39;) # 打开详情窗口 detail_btn = book.find_element(By.CLASS_NAME, &#39;detail-link&#39;) detail_btn.click() # 切换新窗口 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) new_window = [w for w in driver.window_handles if w != driver.current_window_handle][0] driver.switch_to.window(new_window) # 提取详情数据 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, &#39;book-detail&#39;)) ) description = driver.find_element(By.CLASS_NAME, &#39;description&#39;).text isbn = driver.find_element(By.XPATH, &#39;//td[text()="ISBN"]/following-sibling::td&#39;).text # 合并数据 book_data.append({ "书名": title, "作者": author, "价格": price, "简介": description, "ISBN": isbn }) # 关闭详情页 driver.close() driver.switch_to.window(driver.window_handles[0]) time.sleep(1) # 防止操作过快被拦截 finally: driver.quit() # 保存数据 with open(&#39;book_details.csv&#39;, &#39;w&#39;, newline=&#39;&#39;, encoding=&#39;utf-8&#39;) as f: writer = csv.DictWriter(f, fieldnames=["书名", "作者", "价格", "简介", "ISBN"]) writer.writeheader() writer.writerows(book_data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值