新手问题指教
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>
这里哪种方式获取?程序代码如何写呢? 嘿,鱼油,看起来你陷入了个“标题和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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-14 09:51
嘿,鱼油,看起来你陷入了个“标题和URL大冒险”!这是我们Python中的经典情节。好吧,别担心,我来帮你。
...
第一种方式,都是在li标签里。
但是,第一个:
<span class="li-active">培训班1</span>
第二、三、四个是:
<span>培训班2</span> 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-14 10:26
明白了,如果所有的标题都在 `li` 标签内部,但是第一个标题是在 `li` 之外,那么我们可以稍作调整来处 ...
第二种方法是出错:
requests.exceptions.SSLError 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 小助理,如未能正确解答您的问题,请继续追问。 现在第一种和第二种都不考虑。
<div class="inline-block class-name h3 text-overflow strong" title="培训班">化工过程安全管理网上专题培训班</div>
在response中,如何获得文字“化工过程安全管理网上专题培训班”呢? 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 小助理,如未能正确解答您的问题,请继续追问。
<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
该如何写代码? 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]