1. HTML结构解析器

1.1. Xpath

官方而言,Xpath是一种能够在XML树状结构中查找节点的技术。在处理网页时,对于那些结构较为清晰的网页,我们通常会选择使用Xpath进行解析。

1.2. 简单示例

下面是一个简单的例子,展示如何使用Xpath从HTML文档中获取数据:

from lxml import etree

html = """
<div>
    <l>
        <liclass="item-">
            <ahref="link1.html">firstitem</a>
        </li>
        <liclass="item-1">
            <ahref="link2.html">seconditem</a>
        </li>
        <liclass="item-inactive">
            <ahref="link3.html">thirditem</a>
        </li>
        <liclass="item-1">
            <ahref="link4.html">forthitem</a>
        </li>
        <liclass="item-">
            <ahref="link5.html">fifthitem</a>
        </li>
    </l>
</div>
"""

element = etree.HTML(html)
links = element.xpath('//l/li/a/@href')
titles = element.xpath('//l/li/a/text()')

print(links)  # ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
print(titles)  # ['firstitem', 'seconditem', 'thirditem', 'forthitem', 'fifthitem']

2. BeautifulSoup解析

2.1. 原理及特点

BS4(BeautifulSoup)也是一种常用的解析方式,其原理与Xpath相似。相较于Xpath,BS4只需要记住一些方法即可。

2.2. 安装及使用

你可以通过以下命令安装BS4:

pip install lxml
pip install bs4

这里需要指出的是,BS4依赖于lxml库,因此需要首先安装lxml。详细的使用方法可以参考中文文档:https://www.beautifulsoup.org/zh_CN/v4.4.0/

2.3. 简单示例

下面是一个简单的例子:

from bs4 import BeautifulSoup

html = """
<div id="container">
    <div class="boxpicblockcol"></div>
</div>
"""

soup = BeautifulSoup(html, 'lxml')
element = soup.find('div', {'id': 'container'})  # 获取指定id的标签
list_elements = element.find_all('div', {'class': 'boxpicblockcol'})  # 获取指定class的标签

print(element)
print(list_elements)

3. 使用requests保存图片

3.1. 示例

以下是一个使用requests库获取网页内容的示例:

import requests
url = '需要访问的网页地址'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
req = requests.Request(url, headers=headers)
response = requests.get(req)

html = response.read().decode('utf-8')

print(html)

3.2. 保存图片

以下是一个使用requests库获取并保存图片的示例:

from urllib import request

url = '一个图片地址'
filename = 'xxx.jpg'

with open(filename, 'wb') as f:
    f.write(request.urlopen(url).read())