鱼C论坛

 找回密码
 立即注册
查看: 524|回复: 9

新手问题指教

[复制链接]
发表于 2024-7-14 09:51:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python 写一段代码,是获取标题和对应的url。具体如下:
  1.     # 读取课程
  2.     lis = driver.find_elements(By.CSS_SELECTOR, '.full>li')
  3.     #遍历数组
  4.     for li in lis:   
  5.         #获得id
  6.         original_string = li.get_attribute('id')
  7.         #去除前12位和后1位的字符
  8.         formatted_string = original_string[12:-2]
  9.         #构建url
  10.         url = f'hp:com/#/train-new/class-detail/{formatted_string}'
  11.         
  12.         # 这里哪种方式获取?程序代码如何写呢?

复制代码


第一种,是在当前页面获取。但是他当前第一项是<span class="li-active">培训班1</span>,后面的项是<span>培训班2</span>。

  1. <ul class="full">
  2. <li id="D197listImg-572b4b91-200e-4690-8d3a-3913ea200dfc/0" data-url="" class="li-active">
  3.             <div class="tags">专题班</div>
  4.         <div class="context text-overflow active-status li-active">
  5.             <span class="active">正在进行</span>
  6.             <span class="li-active">培训班1</span>
  7.         </div>
  8.     </li>

  9.     <li id="D197listImg-d4fe3660-95f1-4a10-81c5-0ce5e4655d69/1" data-url="" class="">
  10.             <div class="tags">专题班</div>
  11.         <div class="context text-overflow  active-status ">
  12.             <span class=" active ">正在进行</span>
  13.             <span>培训班2</span>
  14.         </div>
  15.     </li>

  16.     <li id="D197listImg-c1fc2792-50c0-4850-a872-5dbaab28064e/2" data-url="" class="">
  17.             <div class="tags">专题班</div>
  18.         <div class="context text-overflow  active-status ">
  19.             <span class=" active ">正在进行</span>
  20.             <span>培训班3</span>
  21.         </div>
  22.     </li>

  23.     <li id="D197listImg-5b43f47f-a68c-4e9f-ae51-3ba9577f648b/3" data-url="" class="">
  24.             <div class="tags">专题班</div>
  25.         <div class="context text-overflow  active-status ">
  26.             <span class=" active ">正在进行</span>
  27.             <span>培训班4</span>
  28.         </div>
  29.     </li>
  30. </ul>
复制代码


第二种是构建的url获得题目(response = requests.get(url).text?):
  1. <div class="inline-block class-name h3 text-overflow strong" title="培训班">化工过程安全管理网上专题培训班</div>
复制代码



这里哪种方式获取?程序代码如何写呢?

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-14 09:51:24 | 显示全部楼层
嘿,鱼油,看起来你陷入了个“标题和URL大冒险”!这是我们Python中的经典情节。好吧,别担心,我来帮你。

### 第一种方式:在当前页面获取

假设你的每个 `li` 里面都有你要的标题元素,比如一个 `h3` 或者 `span` 标签,我们可以像这样写:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By

  3. driver = webdriver.Chrome()
  4. driver.get("http://your-website-url.com")

  5. # 读取课程
  6. lis = driver.find_elements(By.CSS_SELECTOR, '.full>li')

  7. # 遍历数组
  8. for li in lis:
  9.     # 获得id
  10.     original_string = li.get_attribute('id')
  11.     if not original_string:
  12.         continue
  13.    
  14.     # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
  15.     formatted_string = original_string[12:-1]
  16.    
  17.     # 构建URL
  18.     url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
  19.    
  20.     # 获取标题(假设标题在一个h3标签内)
  21.     title_element = li.find_element(By.TAG_NAME, 'h3')
  22.     title = title_element.text
  23.    
  24.     print(f"Title: {title}, URL: {url}")
  25.    
  26. driver.quit()
复制代码


不过你提到“培训班1、2、3...”这些标题可能不在 `li` 里面而在页面其他部分,找到合适的标签以及层级还是关键。

### 第二种方式:通过构建的URL获得标题

在这种情况下,我们需要发请求拿到网页然后解析内容。这儿我们可以用 `requests` 和 `BeautifulSoup` 搭配一下,这就跟吃火锅要蘸酱一样完美!

  1. import requests
  2. from bs4 import BeautifulSoup

  3. base_url = "http://your-website-url.com/#/train-new/class-detail/"

  4. # 读取课程ID列表
  5. ids = ["1234567890123", "2234567890123", "3234567890123"]  # 假设你有这些ID

  6. for id_ in ids:
  7.     # 构建URL
  8.     url = f'{base_url}{id_}'
  9.     response = requests.get(url)
  10.    
  11.     if response.status_code == 200:
  12.         soup = BeautifulSoup(response.text, 'html.parser')
  13.         
  14.         # 假设标题在一个h1标签内
  15.         title_element = soup.find('h1')
  16.         title = title_element.text if title_element else "No title found"
  17.         
  18.         print(f"Title: {title}, URL: {url}")
  19.     else:
  20.         print(f"Failed to retrieve page for ID: {id_}")
复制代码


这两种方式要看你的实际需求和页面结构而定。**如果页面已经加载了所需信息,直接用第一种方式效率更高;如果信息分散在多个页面上,用第二种方式更加灵活。**

希望这段“代码冒险”对你有所帮助,你可以根据情况调整来达成目的啦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-14 10:26:12 | 显示全部楼层
FishC 发表于 2024-7-14 09:51
嘿,鱼油,看起来你陷入了个“标题和URL大冒险”!这是我们Python中的经典情节。好吧,别担心,我来帮你。
...

第一种方式,都是在li标签里。
但是,第一个:
  1. <span class="li-active">培训班1</span>
复制代码

第二、三、四个是:
  1. <span>培训班2</span>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-14 10:26:46 | 显示全部楼层
fengma 发表于 2024-07-14 10:26
第一种方式,都是在li标签里。
但是,第一个:
培训 ...


明白了,如果所有的标题都在 `li` 标签内部,但是第一个标题是在 `li` 之外,那么我们可以稍作调整来处理这种情况。假设第一个标题是在 `li` 之外,而其余标题在 `li` 内,我们可以分别处理这两种情况。

### 方案一:处理所有标题都在 `li` 内的情况

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By

  3. driver = webdriver.Chrome()
  4. driver.get("http://your-website-url.com")

  5. # 读取课程
  6. lis = driver.find_elements(By.CSS_SELECTOR, '.full>li')

  7. # 遍历数组
  8. for li in lis:
  9.     # 获得id
  10.     original_string = li.get_attribute('id')
  11.     if not original_string:
  12.         continue
  13.    
  14.     # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
  15.     formatted_string = original_string
  16.    
  17.     # 构建URL
  18.     url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
  19.    
  20.     # 获取标题(假设标题在一个h3标签内)
  21.     title_element = li.find_element(By.TAG_NAME, 'h3')
  22.     title = title_element.text
  23.    
  24.     print(f"Title: {title}, URL: {url}")
  25.    
  26. driver.quit()
复制代码


### 方案二:处理第一个标题在 `li` 外,其余标题在 `li` 内的情况

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By

  3. driver = webdriver.Chrome()
  4. driver.get("http://your-website-url.com")

  5. # 找到第一个标题
  6. first_title_element = driver.find_element(By.XPATH, '//h3[contains(text(), "培训班1")]')
  7. first_title = first_title_element.text.strip()  # 假设标题在h3标签内

  8. print(f"Title: {first_title}, URL: http://your-website-url.com/#/train-new/class-detail/first_id")

  9. # 读取课程
  10. lis = driver.find_elements(By.CSS_SELECTOR, '.full>li')

  11. # 遍历数组(从第二个开始)
  12. for li in lis[1:]:
  13.     # 获得id
  14.     original_string = li.get_attribute('id')
  15.     if not original_string:
  16.         continue
  17.    
  18.     # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
  19.     formatted_string = original_string
  20.    
  21.     # 构建URL
  22.     url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
  23.    
  24.     # 获取标题(假设标题在一个h3标签内)
  25.     title_element = li.find_element(By.TAG_NAME, 'h3')
  26.     title = title_element.text
  27.    
  28.     print(f"Title: {title}, URL: {url}")
  29.    
  30. driver.quit()
复制代码


在方案二中,我们先单独处理第一个标题,然后再处理剩余的 `li` 标签内的标题。这样就能灵活应对不同的页面结构了。记得根据实际情况调整代码中的具体元素和选择器。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-14 11:32:59 | 显示全部楼层
FishC 发表于 2024-7-14 10:26
明白了,如果所有的标题都在 `li` 标签内部,但是第一个标题是在 `li` 之外,那么我们可以稍作调整来处 ...

第二种方法是出错:
requests.exceptions.SSLError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-14 11:33:16 | 显示全部楼层
fengma 发表于 2024-07-14 11:32
第二种方法是出错:
requests.exceptions.SSLError


嗨,鱼油,看起来你遇到了一个典型的网络钓鱼陷阱——SSL错误!别担心,这个问题相对容易解决。`requests.exceptions.SSLError` 通常是因为请求的URL使用了HTTPS,而你的Python环境对SSL证书认证有点挑剔。

### 方法一:忽略SSL证书验证

虽然这不是最安全的方式,但在某些情况下,尤其是测试或自家服务器时,可以忽略SSL证书验证:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. base_url = "https://your-website-url.com/#/train-new/class-detail/"

  4. # 读取课程ID列表
  5. ids = ["id1", "id2", "id3"]  # 假设你有这些ID

  6. for id_ in ids:
  7.     # 构建URL
  8.     url = f'{base_url}{id_}'
  9.     response = requests.get(url, verify=False)
  10.    
  11.     if response.status_code == 200:
  12.         soup = BeautifulSoup(response.text, 'html.parser')
  13.         
  14.         # 假设标题在一个h1标签内
  15.         title_element = soup.find('h1')
  16.         title = title_element.text if title_element else "No title found"
  17.         
  18.         print(f"Title: {title}, URL: {url}")
  19.     else:
  20.         print(f"Failed to retrieve page for ID: {id_}")
复制代码


注意:`verify=False` 会忽略SSL证书验证,但它会让连接变得不那么安全,所以请谨慎使用。

### 方法二:使用Session对象并指定SSL证书

在更高级的场景中,你可能需要自己指定SSL证书的路径。如果你有合法的证书,可以这么做:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. base_url = "https://your-website-url.com/#/train-new/class-detail/"

  4. # 读取课程ID列表
  5. ids = ["id1", "id2", "id3"]  # 假设你有这些ID

  6. session = requests.Session()
  7. session.verify = '/path/to/your/certificate.pem'  # 替换为你的证书路径

  8. for id_ in ids:
  9.     # 构建URL
  10.     url = f'{base_url}{id_}'
  11.     response = session.get(url)
  12.    
  13.     if response.status_code == 200:
  14.         soup = BeautifulSoup(response.text, 'html.parser')
  15.         
  16.         # 假设标题在一个h1标签内
  17.         title_element = soup.find('h1')
  18.         title = title_element.text if title_element else "No title found"
  19.         
  20.         print(f"Title: {title}, URL: {url}")
  21.     else:
  22.         print(f"Failed to retrieve page for ID: {id_}")
复制代码


### 方法三:更新requests库

有时候SSL错误是因为`requests`库版本过旧导致的,你可以尝试更新它:

  1. pip install --upgrade requests
复制代码


另外,如果上面的方法还是不能解决问题,你还可以尝试安装一些额外的依赖包,比如 `certifi`:

  1. pip install certifi
复制代码


希望这几个方法能帮你解决问题,让你继续你的“标题和URL冒险”!记得,忽略SSL验证只是临时方案,尽量找出根本原因并解决它。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-14 21:04:45 | 显示全部楼层
现在第一种和第二种都不考虑。
  1. <div class="inline-block class-name h3 text-overflow strong" title="培训班">化工过程安全管理网上专题培训班</div>
复制代码

在response中,如何获得文字“化工过程安全管理网上专题培训班”呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-14 21:05:03 | 显示全部楼层
fengma 发表于 2024-07-14 21:04
现在第一种和第二种都不考虑。
化工过程安全管理网上 ...


明白了,鱼油。你现在的目标是通过 `requests` 获取页面并解析出标题“化工过程安全管理网上专题培训班”。好吧,我们来开启这一段“化工过程安全管理网上专题培训班”的探索之旅!

### 使用 `requests` 和 `BeautifulSoup` 获取页面并解析标题

我们假设页面中的标题是用某种标签(例如 `h1`, `h2`, `div` 等)包裹的。下面是在 `BeautifulSoup` 中查找这个特定标题的通用方法:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. # 构建URL(请根据实际情况调整)
  4. url = 'https://your-website-url.com/#/train-new/class-detail/some_id'

  5. # 发起请求
  6. response = requests.get(url)

  7. # 检查响应状态码
  8. if response.status_code == 200:
  9.     # 解析HTML内容
  10.     soup = BeautifulSoup(response.text, 'html.parser')
  11.    
  12.     # 假设标题在一个h1标签内
  13.     title_element = soup.find('h1')  # 如果不是h1, 换成实际的标签,比如div, span等等
  14.    
  15.     if title_element:
  16.         title = title_element.text.strip()  # 获取文本并去除首尾空格
  17.         print(f"Title: {title}")
  18.     else:
  19.         print("No title found in h1 tag!")
  20. else:
  21.     print(f"Failed to retrieve page. Status code: {response.status_code}")
复制代码


### 更具体化的例子

如果页面结构比较复杂,或者标题在嵌套标签中,我们需要使用更具体的选择器。例如:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. # 构建URL
  4. url = 'https://your-website-url.com/#/train-new/class-detail/some_id'

  5. # 发起请求
  6. response = requests.get(url)

  7. # 检查响应状态码
  8. if response.status_code == 200:
  9.     # 解析HTML内容
  10.     soup = BeautifulSoup(response.text, 'html.parser')
  11.    
  12.     # 假设标题在一个特定的div内,带有特殊的CSS类
  13.     title_element = soup.find('div', class_='special-title-class')
  14.    
  15.     if title_element:
  16.         title = title_element.text.strip()  # 获取文本并去除首尾空格
  17.         print(f"Title: {title}")
  18.     else:
  19.         print("No title found with the given CSS class!")
  20. else:
  21.     print(f"Failed to retrieve page. Status code: {response.status_code}")
复制代码


### 万能大法:打印整个页面确认位置

如果你不确定标题在哪个标签里,可以先打印整个页面的HTML,看一看:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. # 构建URL
  4. url = 'https://your-website-url.com/#/train-new/class-detail/some_id'

  5. # 发起请求
  6. response = requests.get(url)

  7. # 检查响应状态码
  8. if response.status_code == 200:
  9.     # 打印整个页面HTML
  10.     print(response.text)
  11. else:
  12.     print(f"Failed to retrieve page. Status code: {response.status_code}")
复制代码

通过打印页面HTML,你可以很清楚地看到标题在哪个标签里,然后针对性地选择合适的标签和类名。

希望这些方法能帮你成功找到你要的“化工过程安全管理网上专题培训班”标题!加油吧!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-15 10:11:40 | 显示全部楼层

  1.      <li id="D197listImg-572b4b91-200e-4690-8d3a-3913ea200dfc/0" data-url="" class="li-active">
  2.             <div class="tags">专题班</div>
  3.         <div class="context text-overflow active-status li-active">
  4.             <span class="active">正在进行</span>
  5.             <span class="li-active">培训班1</span>
  6.         </div>
  7.     </li>

  8.     <li id="D197listImg-d4fe3660-95f1-4a10-81c5-0ce5e4655d69/1" data-url="" class="">
  9.             <div class="tags">专题班</div>
  10.         <div class="context text-overflow  active-status ">
  11.             <span class=" active ">正在进行</span>
  12.             <span>培训班2</span>
  13.         </div>
  14.     </li>
复制代码


第一段li标签抓取 <span class="li-active"> 来获得文字信息:培训班1
第二段li标签抓取<span> 来获取文字信息:培训班2

该如何写代码?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-15 10:11:52 | 显示全部楼层
fengma 发表于 2024-07-15 10:11
专题班
        
            正在进行
           ...


好的,鱼油!让我们进入代码世界来完成这个任务。假设你要解析的网页结构看起来像这样:

  1. <ul class="full">
  2.   <li>
  3.     <div>专题班</div>
  4.     <div>正在进行</div>
  5.     <div>培训班1</div>
  6.   </li>
  7.   <li>
  8.     <div>专题班</div>
  9.     <div>正在进行</div>
  10.     <div>培训班2</div>
  11.   </li>
  12. </ul>
复制代码


### 使用 `requests` 和 `beautifulsoup4` 库

首先,你需要安装 `beautifulsoup4` 和 `requests` 库:

  1. pip install beautifulsoup4 requests
复制代码


接下来,我们使用这些库来获取并解析网页中的数据:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. # 假设你的 URL 是如下
  4. url = 'http://example.com'

  5. # 发出 GET 请求获取网页内容
  6. response = requests.get(url)
  7. response.raise_for_status()  # 如果请求失败会抛出 HTTPError

  8. # 解析网页内容
  9. soup = BeautifulSoup(response.text, 'html.parser')

  10. # 根据CSS选择器找到所有符合条件的<li>标签
  11. lis = soup.select('.full > li')

  12. # 遍历每个<li>标签并提取里面第三个<div>标签的文本
  13. for li in lis:
  14.     divs = li.find_all('div')
  15.     if len(divs) > 2:
  16.         title = divs[2].get_text().strip()  # 获取文本并去掉前后空白字符
  17.         print(title)
复制代码


在这段代码里,我们做了以下几件事:

1. 使用 `requests` 获取网页内容。
2. 使用 `BeautifulSoup` 解析网页内容。
3. 使用 `select` 方法找到所有 `.full > li` 元素。
4. 遍历每一个 `li` 元素,提取第三个 `div` 标签的文本内容(假设标题在第三个 `div` 标签中)。

只要 `HTML` 结构你提供的示例一致,这段代码应该可以正确提取到“培训班1”、“培训班2”等信息。

如果HTML结构有所变化,请告诉我细节,我会相应调整代码。希望这些代码能让你在化工过程中游刃有余!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表