from urllib.parse import urljoin from lxml import etree import requests url = "https://sph.pku.edu.cn/szdw/lxbywstjxx.htm" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.12022 SLBChan/25" } response = requests.get(url, headers=headers) response.encoding = response.apparent_encoding content = response.text html = etree.HTML(content) list = html.xpath("/html/body/div[3]/div/div/div[3]/div[2]/ul/li/div[1]/a") for a in list: link = a.xpath(".//@href")[0] detail_url = urljoin(url, link) # print(link) new_response = requests.get(detail_url, headers=headers) new_response.encoding = new_response.apparent_encoding new_content = new_response.text new_html = etree.HTML(new_content) div = new_html.xpath("/html/body/div/div[4]/div/div/div[3]/div[2]/form[1]/div[1]/div[2]") for div in div: name = div.xpath(".//h2/span/text()") email = div.xpath(".//ul/li[2]/span/text()") name = str(name)[2:-2] email = str(email)[2:-2] print(name) print(email)
时间: 2023-06-07 07:09:39 浏览: 301
这段代码使用Python,导入urllib.parse和lxml.etree模块以及requests模块来爬取指定网站的信息。使用requests模块发起一个GET请求获取网页内容,并使用etree模块来解析HTML文档。其中,使用xpath方法从HTML文档中获取所需信息,再使用urljoin方法将相对链接转换为绝对链接。
相关问题
from urllib.parse import urljoinimport openpyxlfrom openpyxl import load_workbook
<think>我们首先需要明确用户的需求:用户希望了解如何使用Python的`urllib.parse.urljoin`和`openpyxl`库。这两个库分别用于URL处理和Excel文件操作。下面将分别介绍这两个库的基本用法,并提供示例代码。###1.urllib.parse.urljoin使用教程`urllib.parse.urljoin`函数用于将基础URL和另一个URL组合成一个绝对URL。这在处理网页链接时非常有用,特别是当需要将相对URL转换为绝对URL时。
####基本语法```pythonurllib.parse.urljoin(base, url, allow_fragments=True)
```- `base`:基础URL(字符串)- `url`:要组合的URL(字符串),可以是相对路径- `allow_fragments`:可选参数,是否允许片段标识符(如#后面的部分),默认为True####示例```pythonfromurllib.parse importurljoin#示例1:url是相对路径print(urljoin('http://www.example.com/path/file.html', 'subpath/file.html'))
#输出: http://www.example.com/path/subpath/file.html#示例2:url是绝对路径print(urljoin('http://www.example.com/path/file.html','/subpath/file.html'))#输出:http://www.example.com/subpath/file.html#示例3:基础URL包含路径,url是相对路径print(urljoin('http://www.example.com/path/', 'subpath/file.html'))
#输出: http://www.example.com/path/subpath/file.html#示例4:基础URL不包含路径print(urljoin('http://www.example.com','subpath/file.html'))#输出:http://www.example.com/subpath/file.html```
####注意事项-如果`url`是一个绝对URL(即以`http://`或`https://`开头),则直接返回`url`,忽略`base`。-如果`url`以`/`开头,则替换基础URL的路径部分。
-如果`url`是相对路径,则追加到基础URL的路径后面。
###2. openpyxl使用教程`openpyxl`是一个用于读写Excel2010 xlsx/xlsm/xltx/xltm文件的Python库。下面介绍基本操作:创建工作簿、操作工作表、读写单元格。
####安装```bashpipinstall openpyxl```####基本操作#####创建一个新的工作簿```pythonfromopenpyxl importWorkbook#创建一个工作簿wb =Workbook()#获取默认激活的工作表ws= wb.active#设置工作表标题ws.title= "Sheet1"#创建另一个工作表ws2= wb.create_sheet("Sheet2")
```#####写入数据```python#在Sheet1的A1单元格写入数据ws['A1'] ='Hello'
ws['B1']= 'World'#使用append方法添加一行数据ws.append([1,2,3])ws.append(['A', 'B','C'])#保存工作簿wb.save('example.xlsx')
```#####读取数据```pythonfrom openpyxlimport load_workbook#加载工作簿wb =load_workbook('example.xlsx')
#选择工作表ws =wb['Sheet1']#读取单元格数据cell_value= ws['A1'].valueprint(cell_value)#输出:Hello#遍历行forrow inws.iter_rows(min_row=1,max_col=3, max_row=2,values_only=True):print(row)#输出:('Hello','World', None)和 (1,2,3)```
#####修改单元格```pythonws['A1']= 'New Hello'
wb.save('example.xlsx')```
####注意事项-当使用`load_workbook`加载工作簿时,默认以只读模式打开,但也可以设置`read_only`和`data_only`参数。- `openpyxl`不支持旧版的`.xls`格式,需要处理该格式可以使用`xlrd`和`xlwt`库。###结合使用场景假设我们需要从一个网站上获取一些链接,并将这些链接与基础URL组合成绝对URL,然后将这些URL写入Excel文件。```pythonfromurllib.parse importurljoinfromopenpyxl importWorkbookbase_url= 'http://www.example.com/path/'
relative_urls= ['page1.html', '/page2.html', 'http://other.com/page3.html']#创建一个工作簿wb =Workbook()ws =wb.activews.title= "URLs"ws.append(["AbsoluteURL"])#组合URL并写入Excelfor rel_url inrelative_urls:abs_url =urljoin(base_url, rel_url)ws.append([abs_url])
#保存Excel文件wb.save('urls.xlsx')```
执行上述代码后,Excel文件中将包含三行绝对URL。
###相关问题1.如何处理URL中的特殊字符?2.`openpyxl`如何设置单元格样式(如字体、颜色)?3.如何使用`openpyxl`读取大型Excel文件以提高性能?4.`urllib.parse`中还有哪些常用的函数?5.如何用`openpyxl`合并单元格?
希望以上内容能够帮助您理解和使用这两个库。</think>### Python urllib.parse.urljoin 和 openpyxl 使用教程
#### 一、urllib.parse.urljoin 使用指南
`urllib.parse.urljoin()` 用于将基础URL和相对URL组合成完整URL,特别适合处理网页爬虫或API调用中的链接拼接。
**核心语法:**
```python
from urllib.parse import urljoin
full_url = urljoin(base_url, relative_url, allow_fragments=True)
```
- `base_url`:基础URL(如 `'http://example.com/dir/'`)
- `relative_url`:相对路径(如 `'page.html'` 或 `'/new/page'`)
- `allow_fragments`:是否保留URL片段(如 `#section`),默认为True
**使用示例:**
```python
# 示例1:基本拼接
print(urljoin('https://example.com/docs/', 'tutorial.html'))
# 输出: https://example.com/docs/tutorial.html
# 示例2:处理绝对路径
print(urljoin('https://example.com/docs/', '/api/v1'))
# 输出: https://example.com/api/v1
# 示例3:处理上级目录
print(urljoin('https://example.com/a/b/c', '../d'))
# 输出: https://example.com/a/d
# 示例4:保留片段标识
print(urljoin('https://example.com', 'page#section'))
# 输出: https://example.com/page#section
```
**注意事项:**
1. 当 `relative_url` 是完整URL时,直接返回该URL
2. 路径中的双点 `..` 会自动解析为上级目录
3. 特殊字符会自动编码(如空格转为 `%20`)
#### 二、openpyxl Excel 操作指南
`openpyxl` 是处理Excel文件的强大库,支持读写 `.xlsx` 格式。
**安装:**
```bash
pip install openpyxl
```
**核心操作:**
1. **创建工作簿**
```python
from openpyxl import Workbook
wb = Workbook() # 新建工作簿
ws = wb.active # 获取默认工作表
ws.title = "数据表" # 重命名工作表
```
2. **写入数据**
```python
# 单单元格写入
ws['A1'] = "姓名"
ws.cell(row=1, column=2, value="年龄")
# 多行数据批量写入
data = [
["张三", 25],
["李四", 30]
]
for row in data:
ws.append(row) # 自动追加到末尾
```
3. **读取数据**
```python
# 读取单个单元格
print(ws['A2'].value) # 输出: 张三
# 遍历区域数据
for row in ws.iter_rows(min_row=1, max_col=2, values_only=True):
print(row) # 输出: ('姓名', '年龄') -> ('张三', 25)...
```
4. **保存文件**
```python
wb.save("data.xlsx") # 保存工作簿
```
**高级功能示例:**
```python
# 合并单元格
ws.merge_cells('A1:B1')
ws['A1'] = "员工信息表"
# 设置样式
from openpyxl.styles import Font, Alignment
ws['A1'].font = Font(bold=True, size=16)
ws['A1'].alignment = Alignment(horizontal='center')
# 读取现有文件
from openpyxl import load_workbook
wb = load_workbook('data.xlsx')
```
#### 三、综合应用场景
**场景:爬取网页链接并保存到Excel**
```python
from urllib.parse import urljoin
from openpyxl import Workbook
# 模拟爬取的链接
base_url = "https://example.com/news/"
relative_links = ['2023/article1', '/archives/2022', 'https://other.com']
# 处理URL
absolute_links = [urljoin(base_url, link) for link in relative_links]
# 写入Excel
wb = Workbook()
ws = wb.active
ws.append(["序号", "完整URL"])
for idx, url in enumerate(absolute_links, 1):
ws.append([idx, url])
wb.save("links.xlsx")
```
**生成文件内容示例:**
| 序号 | 完整URL |
|------|-----------------------------|
| 1 | https://example.com/news/2023/article1 |
| 2 | https://example.com/archives/2022 |
| 3 | https://other.com |
#### 注意事项
1. **URL拼接陷阱**:当基础URL以 `/` 结尾时,相对路径会直接拼接;否则会替换最后部分路径[^2]
2. **Excel性能**:处理大文件时使用 `read_only=True` 模式提升读取速度
3. **编码处理**:`urllib.parse` 会自动处理特殊字符编码[^3]
4. **文件权限**:保存Excel前确保文件未被其他程序锁定
注释以下代码from re import findall from urllib.parse import urljoin from urllib.request import urlopen, Request url = r'http://jwc.sdtbu.edu.cn/info/2002/5418.htm' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36', 'Referer': url, } # 不加这一项会有防盗链提示 req = Request(url=url, headers=headers) with urlopen(req) as fp: content = fp.read().decode() pattern = r'<a href="(.+?)"><span>(.+?)</span>' for fileUrl, fileName in findall(pattern, content): if 'javascript' in fileUrl: continue fileUrl = urljoin(url, fileUrl) req = Request(url=fileUrl, headers=headers) with urlopen(req) as fp1: with open(fileName, 'wb') as fp2: fp2.write(fp1.read())
以下是对代码的注释:
```python
# 导入所需的模块
from re import findall
from urllib.parse import urljoin
from urllib.request import urlopen, Request
# 要爬取的网页地址
url = r'http://jwc.sdtbu.edu.cn/info/2002/5418.htm'
# 设置请求头,模拟浏览器访问,避免反爬虫机制
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
'Referer': url, # 不加这一项会有防盗链提示
}
# 构造请求对象
req = Request(url=url, headers=headers)
# 发送请求,获取网页内容
with urlopen(req) as fp:
content = fp.read().decode()
# 匹配网页中的文件链接和文件名
pattern = r'<a href="(.+?)"><span>(.+?)</span>'
for fileUrl, fileName in findall(pattern, content):
# 排除非文件链接(如javascript链接)
if 'javascript' in fileUrl:
continue
# 拼接文件链接的完整地址
fileUrl = urljoin(url, fileUrl)
# 构造请求对象
req = Request(url=fileUrl, headers=headers)
# 发送请求,获取文件内容,并保存到本地
with urlopen(req) as fp1:
with open(fileName, 'wb') as fp2:
fp2.write(fp1.read())
```
代码的作用是从指定网页中爬取文件链接,并将文件下载到本地。其中,使用了正则表达式对网页内容进行匹配,并使用 urllib 库发送请求和获取响应。在请求头中设置了 User-Agent 和 Referer 字段,模拟浏览器访问,避免被反爬虫机制拦截。
阅读全文
相关推荐
















