文章目录
感兴趣的可以看我的另一篇博客:一次完整的爬虫
利用requests和xpath爬取网页内容过程
需要安装lxml库,xpath()方法放回的结果是一个列表
1.1 XPath 常用规则
表达式 | 描述 |
---|---|
nodename | 1 |
// | 从当前节点选取子孙节点 |
/ | 从当前节点选取子节点 |
. | 选取当前结点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
例子:
//title[@lang='eng']
这是一个 XPath 规则,代表的是选择所有名称为 title,同时属性 class 的值为 eng 的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。
1.2 获取文本
# 第一种
# 获取文本所在节点后直接获取文本
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)
# 第二种
# 会获取到补全代码时换行产生的特殊字符,推荐使用第一种方法,可以保证获取的结果是整洁的。
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)
1.3 要提取的信息有大量空格
使用normalize-space()函数:
# 提取出来会有大量空格
level = html.xpath('//table[@class="info-tb"]/tr[4]/td[4]/text()')
# 使用normalize-space()
level = html.xpath('normalize-space(//table[@class="info-tb"]/tr[4]/td[4]/text())')
1.4 多属性匹配
# 直接在xpath中使用and
from lxml import etree
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
1.5 提取的网址不是完全意义上的网址
只是部分的网址,例如这个网站提取的就是缺少https://dl.58.com
的网址,所以要给加上这一块,当提取完后,可以直接这样:
return ['https://dl.58.com' + item for item in list_urls]
1.6 遇到tbody的情况如何处理:
这是网页的规范性问题,可以直接跳过,我们定位路径的时候可以直接忽略这个点
1.7 提取的内容有好多tr,td:
这个时候我们可以直接定位到某一个点:
# 第三个tr,第四个td
price = html.xpath('normalize-space(//table[@class="info-tb"]/tr[3]/td[4]/text())')