一、xpath的语法
xpath是用来对XML文件进行解析的。
针对如下的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
/:表示路径;
//:表示所有;
[]:表示内容;
@:表示属性;
text():表示文本;
.:表示当前节点;
..:表示上一节点;
实例:
1. 取出bookstore中的第一个book
/bookstore/book[0]
2. 取出bookstore下的所有book
/bookstore//book
或者直接
//book
3. 获取所有title的文本
/bookstore//book/title[@lang="en"]/text()
或者
//title/text()
4. 获取title的语言类别
//title/@lang
5. 模糊查询
<div id="qiushi_tag_011">...</div>
<div id="qiushi_tag_021">...</div>
<div id="qiushi_tag_031">...</div>
<div id="qiushi_tag_041">...</div>
<div id="qiushi_tag_051">...</div>
此时可使用模糊查询来匹配所有的节点:
//div[contains(@id, "qiushi_tag")]
注意:使用/来表示路径时,必须一级一级地来,使用//来表示时,可以跨节点。
二、xpath的使用
对于未使用scrapy框架的代码来说,需要将爬取的html文件转换为XML文件,才能使用xpath来解析
需要导入lxml中的etree
#coding:utf-8
import urllib.request
from lxml import etree
link="http://tieba.baidu.com/f?kw=lol&pn=1"
request = urllib.request.Request(link)
html = urllib.request.urlopen(request).read()
# 解析
content = etree.HTML(html)
# 取出帖子里每层层主发送的图片连接集合
#link_list = content.xpath('//img[@class="BDE_Image"]/@src')
link_list = content.xpath(
'//div[@class="threadlist_detail clearfix"]//li/a/img/@data-original'
)
# 取出每个图片的连接
for link in link_list:
print(link)