简介
这里用到了 lxml-etree,同样是一个用于定位、获取内容的工具,解析 xpath。
安装
pip install lxml
导入
from lxml import etree
调用
Step1:将数据交给 etree
resp = requests.get(url)
html = etree.HTML(resp.text)
这里的 etree.HTML
代表解析从服务器获得的 html 数据
etree.[xxx]有很多种用法:
etree.HTML 代表解析从服务器获得的 html 数据
etree.parse 是从本地文件解析
etree.XML 可以解析 XML 文件
Step2:使用 Xpath
提取标签内的内容
在普通 xpath 后添加/text()
result = html.xpath("/html/body/ul/li/a/text()")
限制于第 N 个标签里提取内容
在需要索引第 n 个的标签后加上 [num]
,num=1 则是限制为第一个 xx 标签
result = html.xpath("/html/body/ul/li[1]/a/text()")
通过标签属性筛选内容
如下,与限制第 n 个标签的用法类似,筛选 href 属性为 xxx 的 a 标签,格式:[@property='xxx']
result = html.xpath('/html/body/ul/li/a[@href="http://google.com"]/text()')
提取标签属性的值
result = html.xpath('/html/body/ul/li/a/@href')
使用相对查找
li_list = html.xpath("/html/body/ul/li")
for li in li_list:
li_a_content = li.xpath("./a/text()")
li_a_href = li.xpath("./a/@href")
print(li_a_content + li_a_href)
如这个例子,li_a_content = li.xpath("./a/text()")
的意思就是在 li
标签中查找 /a/text()
,而不是从全局的 html 代码中查找。
利用 Xpath 爬取猪八戒网的搜索结果页
import requests
from lxml import etree
url = "https://xingtai.zbj.com/search/f/?type=new&kw=ui"
keyword = url.split("=")[-1] #将搜索关键字提取出来,以“=”为分割,取最后一个
resp = requests.get(url)
html = etree.HTML(resp.text) #将页面代码交给etree
divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div") #将搜索结果的div列表存为divs
for div in divs:
title = keyword.join(div.xpath('./div/div/a[1]/div[2]/div[2]/p/text()'))
#提取搜索到的标题,因为标题将关键字做了高亮显示,所以xpath获取到的内容为“xxx,xxx”,利用join将关键字插入到被分割的地方,即可获得完整的标题
price = div.xpath('.//*[@id="utopia_widget_70"]/a[1]/div[2]/div[1]/span[1]/text()')[0].strip("¥")
#提取价格,需要用到列表,所以添加[0],并去掉前面的¥
print(title + " " + price)