009 - 使用XPath解析网页

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。用 XPath 解析网页的内容,就是确定所取内容的路径,即从大范围缩小到具体的位置。

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。(相对路径)
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

text() 提取文本内容
@xxx 提取属性内容

找到XPath两种方法,一种是手动分析,需要对HTML结构熟悉,了解标签嵌套层级;另一种是Chrome 工具copy,同时要结合网页标签的进行校验。

还是以糗事百科段子笑话为例 http://www.qiushibaike.com/text/

009 - 使用XPath解析网页_第1张图片

拷贝出来的XPath内容如下:

//*[@id="qiushi_tag_118963704"]/a/div/span/text()

注意,这里[@id="qiushi_tag_118963704"] 指的是div class="article block untagged mb15" ,是唯一的。如果想取出所有的位置的段子内容,就不能做唯一限定。修改为:

//div[@class="article block untagged mb15"]/a/div/span/text()

网页标签id是唯一的,class标签是同一类标签的样式。使用标签属性,方便我们取出同一类型的内容。

# coding=utf-8

import requests
from lxml import etree

html = requests.get('http://www.qiushibaike.com/text/').content

selector = etree.HTML(html)

content = selector.xpath('//div[@class="article block untagged mb15"]/a/div/span/text()')

for each in content:
    print each


PS 参见之前文章: 爬虫搜索神器BeautifulSoup和XPath 的使用

你可能感兴趣的:(009 - 使用XPath解析网页)