python爬⾍⼊门(三)XPATH和BeautifulSoup4
⽤正则处理HTML⽂档很⿇烦,我们可以先将 HTML⽂件转换成 XML⽂档,然后⽤ XPath 查 HTML 节点或元素。
XML 指可扩展标记语⾔(EXtensible Markup Language)
XML 是⼀种标记语⾔,很类似 HTML
XML 的设计宗旨是传输数据,⽽⾮显⽰数据
XML 的标签需要我们⾃⾏定义。
XML 被设计为具有⾃我描述性。
XML 是 W3C 的推荐标准
<?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" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
XML实例
XML和HTML区别
HTML DOM 模型⽰例
HTML DOM 定义了访问和操作 HTML ⽂档的标准⽅法,以树结构⽅式表达 HTML ⽂档
XPATH
XPath (XML Path Language) 是⼀门在 XML ⽂档中查信息的语⾔,可⽤来在 XML ⽂档中对元素和属性进⾏遍历。chrome插件XPATH HelPer
Firefox插件XPATH Checker
XPATH语法
最常⽤的路径表达式:
谓语
谓语⽤来查某个特定的节点或者包含某个指定的值的节点,被嵌在⽅括号中。
在下⾯的表格中,我们列出了带有谓语的⼀些路径表达式,以及表达式的结果:
选取位置节点
选取若⼲路劲
安装:pip install lxml
lxml 是⼀个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则⼀样,也是⽤ C 实现的,是⼀款⾼性能的 Python HTML/XML 解析器,可以利⽤XPath语法,来快速的定位特定元素以及节点信息。简单使⽤⽅法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
text = '''
<div>
<li>11</li>
<li>22</li>
<li>33</li>
<li>44</li>
</div>
'''
#利⽤etree.HTML,将字符串解析为HTML⽂档
html = etree.HTML(text)
函数公式vlookup怎么使用# 按字符串序列化HTML⽂档
result = string(html)
print(result)
结果:
1.先到每个帖⼦列表的url集合安卓系统升级包下载
2.再到每个帖⼦⾥⾯的每个图⽚的的完整url链接
3.要⽤到 lxml模块去解析html
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib
import urllib2
from lxml import etree
def loadPage(url):
"""
作⽤:根据url发送请求,获取服务器响应⽂件
url: 需要爬取的url地址
"""
request = urllib2.Request(url)
html = urllib2.urlopen(request).read()
# 解析HTML⽂档为HTML DOM模型
content = etree.HTML(html)
# 返回所有匹配成功的列表集合
link_list = content.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
for link in link_list:
fulllink = "tieba.baidu" + link
# 组合为每个帖⼦的链接
#print link
loadImage(fulllink)
# 取出每个帖⼦⾥的每个图⽚连接
def loadImage(link):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
request = urllib2.Request(link, headers = headers)
html = urllib2.urlopen(request).read()
# 解析
content = etree.HTML(html)
# 取出帖⼦⾥每层层主发送的图⽚连接集合
link_list = content.xpath('//img[@class="BDE_Image"]/@src')
# 取出每个图⽚的连接
for link in link_list:
# print link
writeImage(link)
def writeImage(link):
"""
作⽤:将html内容写⼊到本地
link:图⽚连接python解析json文件
"""编程技术与应用是什么
#print "正在保存 " + filename
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} # ⽂件写⼊
request = urllib2.Request(link, headers = headers)
js个人博客网站布局# 图⽚原始数据
image = urllib2.urlopen(request).read()
# 取出连接后10位做为⽂件名
filename = link[-10:]
# 写⼊到本地磁盘⽂件内
with open(filename, "wb") as f:
f.write(image)
print"已经成功下载 "+ filename
def tiebaSpider(url, beginPage, endPage):
"""
作⽤:贴吧爬⾍调度器,负责组合处理每个页⾯的url
url : 贴吧url的前部分
beginPage : 起始页
endPage : 结束页
"""
for page in range(beginPage, endPage + 1):
pn = (page - 1) * 50
#filename = "第" + str(page) + "页.html"
帝国cms立即购买模板源码fullurl = url + "&pn=" + str(pn)
#print fullurl
loadPage(fullurl)
#print html
print"谢谢使⽤"
if__name__ == "__main__":
kw = raw_input("请输⼊需要爬取的贴吧名:")
beginPage = int(raw_input("请输⼊起始页:"))
endPage = int(raw_input("请输⼊结束页:"))
url = "tieba.baidu/f?"
key = urllib.urlencode({"kw": kw})
fullurl = url + key
tiebaSpider(fullurl, beginPage, endPage)
4.爬取的图⽚全部保存到了电脑⾥⾯
选择器:BeautifulSoup4
和 lxml ⼀样,Beautiful Soup 也是⼀个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
lxml 只会局部遍历,⽽Beautiful Soup 是基于HTML DOM的,会载⼊整个⽂档,解析整个DOM树,因此时间和内存开销都会⼤很多,所以性能要低于lxml。
BeautifulSoup ⽤来解析 HTML ⽐较简单,API⾮常⼈性化,⽀持、Python标准库中的HTML解析器,也⽀持 lxml 的 XML解析器。
Beautiful Soup 3 ⽬前已经停⽌开发,推荐现在的项⽬使⽤Beautiful Soup 4。使⽤ pip 安装即可:pip install beautifulsoup4
使⽤Beautifulsoup4爬取腾讯招聘职位信息
from bs4 import BeautifulSoup
import urllib2
import urllib
import json    # 使⽤了json格式存储
def tencent():
url = 'hr.tencent/'
request = urllib2.Request(url + 'position.php?&start=10#a')
response =urllib2.urlopen(request)
resHtml = ad()
output =open('tencent.json','w')
html = BeautifulSoup(resHtml,'lxml')
# 创建CSS选择器
result = html.select('tr[class="even"]')
result2 = html.select('tr[class="odd"]')
result += result2
items = []
for site in result:
item = {}
name = site.select('td a')[0].get_text()
detailLink = site.select('td a')[0].attrs['href']
catalog = site.select('td')[1].get_text()
recruitNumber = site.select('td')[2].get_text()
workLocation = site.select('td')[3].get_text()
publishTime = site.select('td')[4].get_text()
item['name'] = name
item['detailLink'] = url + detailLink