爬虫解析库:XPath 轻松上手

XPath

    XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。

1. XPath 概览

    XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有想要定位的节点都可以用 XPath 来选择。\
    官方文档:https://www.w3.org/TR/xpath/

2. XPath 常用规则

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选区直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

    这里列出了 XPath 的常用匹配规则,示例如下:

//title[@lang='eng']

    这是一个 XPath 规则,代表的是选择所有名称为 title,同时属性 lang 的值为 eng 的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。

感谢围观

更多请参考这里:
https://www.jianshu.com/p/85a3004b5c06

我的代码

import requests
# 调用XPATH的包
#   XPath,全称 XML Path Language,
# 即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
# 最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。
# 所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
# https://www.jianshu.com/p/85a3004b5c06

from lxml import etree

url = 'http://lol.178.com/'
response = requests.get(url)

with open('178.html', 'wb') as f:
    f.write(response.content)

# 需要找到的是 /html/head/title

html_ele = etree.HTML(response.text)
print(html_ele)
# head_ele = html_ele.xpath('/html/head')
# # print(head_ele[0])
# # title_ele = head_ele[0].xpath('./title')
# # print(title_ele[0])

# 找到了标签, 如何找到标签内的内容
#print(title_ele[0].text)
# 另一种方式就是 通过xpath获取内部的字符串 `/html/head/title/text()`

# 在xpath中可以通过索引的方式获取具体的那个标签, 从1开始
# meta_ele = html_ele.xpath('/html/head/meta[1]')
# print(meta_ele[0])

# 通过@获取标签下的属性
# charset_str = html_ele.xpath('/html/head/meta[1]/@charset')
# print(charset_str[0])

# /html/head/link[1]/@href
# href_str = html_ele.xpath('/html/head/link[1]/@href')
# print(href_str[0])

# 谓词相关信息: /html/body/div[@class="wrap"]
#
div_ele = html_ele.xpath('/html/body/div[@class="wrap"]/@class')
print(div_ele)

# /html/body/div[@class="wrap"]/div[1]/div[@class="head"]
div_ele = html_ele.xpath('/html/body/div[@class="wrap"]/div[1]/div[@class="head"]/@class')
print(div_ele)

# /html/body/div[@class="wrap"]/div/div[1]/div[1]/div/a
div_ele = html_ele.xpath('/html/body/div[@class="wrap"]/div/div[1]/div[1]/div/a/text()')
print(div_ele)

# 搜索内容: //div[@class="head"]

div_ele = html_ele.xpath('//div[@class="Oldversion"]/a/@href')
print(div_ele)

# 获取所有的属性包含 itemprop 的 meta 标签: /html/head/meta[@itemprop]

div_ele = html_ele.xpath('/html/head/meta[@itemprop]/@itemprop')
print(div_ele)

# 获取所有的属性不包含 itemprop 的 meta 标签:, 需要使用not函数
div_ele = html_ele.xpath('/html/head/meta[not(@itemprop)]')
print(div_ele)

# 找到刚刚的ul, XPATH: //ul[@class="ui-nav-main"]//text()
div_ele = html_ele.xpath('//ul[@class="ui-nav-main"]//text()')
print(div_ele)

strs = [item for item in div_ele if item.strip()]
print(strs)

# contains()
# starts_with()
本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
557
收藏
1103
排名:64
访问:12.1 万
私信
所有博文
社区赞助商