fengma 发表于 2024-7-14 09:51:06

新手问题指教

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



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

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

    <li id="D197listImg-d4fe3660-95f1-4a10-81c5-0ce5e4655d69/1" data-url="" class="">
            <div class="tags">专题班</div>
      <div class="context text-overflowactive-status ">
            <span class=" active ">正在进行</span>
            <span>培训班2</span>
      </div>
    </li>

    <li id="D197listImg-c1fc2792-50c0-4850-a872-5dbaab28064e/2" data-url="" class="">
            <div class="tags">专题班</div>
      <div class="context text-overflowactive-status ">
            <span class=" active ">正在进行</span>
            <span>培训班3</span>
      </div>
    </li>

    <li id="D197listImg-5b43f47f-a68c-4e9f-ae51-3ba9577f648b/3" data-url="" class="">
            <div class="tags">专题班</div>
      <div class="context text-overflowactive-status ">
            <span class=" active ">正在进行</span>
            <span>培训班4</span>
      </div>
    </li>
</ul>


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


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

FishC 发表于 2024-7-14 09:51:24

嘿,鱼油,看起来你陷入了个“标题和URL大冒险”!这是我们Python中的经典情节。好吧,别担心,我来帮你。

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

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

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

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

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

# 遍历数组
for li in lis:
    # 获得id
    original_string = li.get_attribute('id')
    if not original_string:
      continue
   
    # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
    formatted_string = original_string
   
    # 构建URL
    url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
   
    # 获取标题(假设标题在一个h3标签内)
    title_element = li.find_element(By.TAG_NAME, 'h3')
    title = title_element.text
   
    print(f"Title: {title}, URL: {url}")
   
driver.quit()

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

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

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

import requests
from bs4 import BeautifulSoup

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

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

for id_ in ids:
    # 构建URL
    url = f'{base_url}{id_}'
    response = requests.get(url)
   
    if response.status_code == 200:
      soup = BeautifulSoup(response.text, 'html.parser')
      
      # 假设标题在一个h1标签内
      title_element = soup.find('h1')
      title = title_element.text if title_element else "No title found"
      
      print(f"Title: {title}, URL: {url}")
    else:
      print(f"Failed to retrieve page for ID: {id_}")

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

fengma 发表于 2024-7-14 10:26:12

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

第一种方式,都是在li标签里。
但是,第一个:
<span class="li-active">培训班1</span>
第二、三、四个是:
<span>培训班2</span>

FishC 发表于 2024-7-14 10:26:46

fengma 发表于 2024-07-14 10:26
第一种方式,都是在li标签里。
但是,第一个:
培训 ...

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

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

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

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

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

# 遍历数组
for li in lis:
    # 获得id
    original_string = li.get_attribute('id')
    if not original_string:
      continue
   
    # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
    formatted_string = original_string
   
    # 构建URL
    url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
   
    # 获取标题(假设标题在一个h3标签内)
    title_element = li.find_element(By.TAG_NAME, 'h3')
    title = title_element.text
   
    print(f"Title: {title}, URL: {url}")
   
driver.quit()

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

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

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

# 找到第一个标题
first_title_element = driver.find_element(By.XPATH, '//h3')
first_title = first_title_element.text.strip()# 假设标题在h3标签内

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

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

# 遍历数组(从第二个开始)
for li in lis:
    # 获得id
    original_string = li.get_attribute('id')
    if not original_string:
      continue
   
    # 去除前12位和后1位的字符(这个理解有点模糊,需要根据具体情况处理)
    formatted_string = original_string
   
    # 构建URL
    url = f'http://your-website-url.com/#/train-new/class-detail/{formatted_string}'
   
    # 获取标题(假设标题在一个h3标签内)
    title_element = li.find_element(By.TAG_NAME, 'h3')
    title = title_element.text
   
    print(f"Title: {title}, URL: {url}")
   
driver.quit()

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

fengma 发表于 2024-7-14 11:32:59

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

第二种方法是出错:
requests.exceptions.SSLError

FishC 发表于 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证书验证:

import requests
from bs4 import BeautifulSoup

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

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

for id_ in ids:
    # 构建URL
    url = f'{base_url}{id_}'
    response = requests.get(url, verify=False)
   
    if response.status_code == 200:
      soup = BeautifulSoup(response.text, 'html.parser')
      
      # 假设标题在一个h1标签内
      title_element = soup.find('h1')
      title = title_element.text if title_element else "No title found"
      
      print(f"Title: {title}, URL: {url}")
    else:
      print(f"Failed to retrieve page for ID: {id_}")

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

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

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

import requests
from bs4 import BeautifulSoup

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

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

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

for id_ in ids:
    # 构建URL
    url = f'{base_url}{id_}'
    response = session.get(url)
   
    if response.status_code == 200:
      soup = BeautifulSoup(response.text, 'html.parser')
      
      # 假设标题在一个h1标签内
      title_element = soup.find('h1')
      title = title_element.text if title_element else "No title found"
      
      print(f"Title: {title}, URL: {url}")
    else:
      print(f"Failed to retrieve page for ID: {id_}")

### 方法三:更新requests库

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

pip install --upgrade requests

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

pip install certifi

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

fengma 发表于 2024-7-14 21:04:45

现在第一种和第二种都不考虑。
<div class="inline-block class-name h3 text-overflow strong" title="培训班">化工过程安全管理网上专题培训班</div>
在response中,如何获得文字“化工过程安全管理网上专题培训班”呢?

FishC 发表于 2024-7-14 21:05:03

fengma 发表于 2024-07-14 21:04
现在第一种和第二种都不考虑。
化工过程安全管理网上 ...

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

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

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

import requests
from bs4 import BeautifulSoup

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

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

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

### 更具体化的例子

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

import requests
from bs4 import BeautifulSoup

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

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

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

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

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

import requests
from bs4 import BeautifulSoup

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

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

# 检查响应状态码
if response.status_code == 200:
    # 打印整个页面HTML
    print(response.text)
else:
    print(f"Failed to retrieve page. Status code: {response.status_code}")
通过打印页面HTML,你可以很清楚地看到标题在哪个标签里,然后针对性地选择合适的标签和类名。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

fengma 发表于 2024-7-15 10:11:40


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

    <li id="D197listImg-d4fe3660-95f1-4a10-81c5-0ce5e4655d69/1" data-url="" class="">
            <div class="tags">专题班</div>
      <div class="context text-overflowactive-status ">
            <span class=" active ">正在进行</span>
            <span>培训班2</span>
      </div>
    </li>

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

该如何写代码?

FishC 发表于 2024-7-15 10:11:52

fengma 发表于 2024-07-15 10:11
专题班
      
            正在进行
         ...

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

<ul class="full">
<li>
    <div>专题班</div>
    <div>正在进行</div>
    <div>培训班1</div>
</li>
<li>
    <div>专题班</div>
    <div>正在进行</div>
    <div>培训班2</div>
</li>
</ul>

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

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

pip install beautifulsoup4 requests

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

import requests
from bs4 import BeautifulSoup

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

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

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

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 新手问题指教