XPath是XML路径语言,它是一种用来确定XML文档中某部分位置的语言。
在python爬虫方面的学习中,xpath至关重要,它与正则相比具有明显的优势。下面将介绍在python中xpath的简单使用。
安装方法不必多说,与其他第三方库的安装方法一样,使用pip安装。
使用方式
首先需要导入库
import lxml.html
接下来就是使用了,话不多说,上代码
# 使用方式介绍
#---------------------------------
#/ 从根标签开始
#// 从当前标签
#* 通配符,选择所有
#//div/book[1]/title 选择div下第一个book标签的title元素
#//div/book/title[@lang='zh'] 选择title属性含有lang且内容为zh的title元素
#//div/book/title[@*] 将含有属性的title标签选出来
#//div/book/title/@* 将title标签中的属性值选出来
#//div/book/title/text() 选出title标签中的内容,使用内置函数text()
#//div/book/title //book/title //title具有相同的结果
#//a[@href='link1.html' and @id='places_neighbours__row'] 把两个条件都满足的a标签选出来
#//a[@href='link1.html' or @id='places_neighbours__row'] 把满足任意一个条件的a标签选出来
#//a[not(@href)] 将不存在href元素的a标签选出来
#//a[@href!='link1.html'] 将存在href元素 但不等于link1.html的a标签选出来
#//li[starts-with(@class,'item')] 将class属性前缀是item的li标签选出来
#//li[contains(@class,'ct')] 将class属性中含有ct关键字的li标签选出来
#//div/book[last()]/title/text() 将最后一个book元素中title内容选出来
#//div/book[last()-1]/title/text() 将倒数第二个book元素中title内容选出来
#//div/book[price > 39]/title/text() 将book中price标签中的内容大于39的选出来
#//book/descendant::* 将后续节点全部选出
#//book/ancestor::* 将祖先节点全部选出
#示例
#------------------------------
test_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html" id="places_neighbours__row">9,596,960first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html" id="places_neighbours__row">fourth item</a></li>
<li class="item-0"><a>fifth item</a></li>
<li class="bectter"><a>fifth item</a></li>
</ul>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="zh" id="places_neighbours__row">Learning XML</title>
<price>38</price>
</book>
<book>
<title>Python</title>
<price>55.55</price>
</book>
</div>
"""
html = lxml.html.fromstring(test_data)
# html_data = html.xpath("//div/book/title[@lang='zh']")
# html_data = html.xpath("//div/book/title[@*]")
# html_data = html.xpath("//div/book/title/@*")
# html_data = html.xpath("//div/book/title/text()")
# html_data = html.xpath("//a[@href='link1.html' and @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[@href='link2.html' or @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[not(@href)]/text()")
# html_data = html.xpath("//a[@href!='link1.html']/text()")
# html_data = html.xpath("//li[@class!='item-0' and @class!='item-1']/a/text()")
# html_data = html.xpath("//div/book[last() ]/title/text()")
# html_data = html.xpath("//div/book[price = 39]/title/text()")
# html_data = html.xpath("//div/book[price < 39 and price >30]/title/text()")
# html_data = html.xpath("//li[starts-with(@class,'item')]/a/text()")
html_data = html.xpath("//li[contains(@class,'ct')]/a/text()")
# html_data = html.xpath("//book/descendant::*")
# html_data = html.xpath("//book/ancestor::*")
# html_data = html.xpath("//div/ul/li[@class='item-0'][1]/a/text()")
print(html_data)
for i in html_data:
print(type(i))
bs4
bs4可以说是别人将xpath再进行了封装,然后供我们使用的更简单的方法,当然,它跟xpath相比运用更简单,但是没有xpath功能全。在实际的爬虫运用中,一些简单的网站爬取不需要用xpath,当然更不需要用正则,这个时候我们可以使用bs4。
导入方法
from bs4 import BeautifulSoup
基本运用
soup = BeautifulSoup(test_data,'lxml')
#基本功能介绍
#--------------------
#标签和属性
# print(soup.a)#获取标签
# print(soup.a['href'])#获取标签属性
# print(soup.a.text)#获取标签内容 .contents也可以
# a_list = soup.find_all("a")#获取所有a标签
#示例
#---------------------
# for a in a_list:
# print(a.text)
# print(soup.li.contents[0]['href'])
#选出id=places_neighbours__row的所有a标签
# a_place = soup.find_all("a",id="places_neighbours__row")
# print(a_place)
#选出id=places_neighbours__row的所有标签
attrs_place = soup.find_all(attrs={"id":"places_neighbours__row"})
print(attrs_place)
最后,附上一个运用xpath爬取糗事百科的代码。。
import requests
import lxml.html
class ParseXpath:
def __init__(self,page):
"""
初始化对象
:param page:页码
"""
#请求头
self.headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
}
#代理IP
self.proxies = {"http":"http://39.137.69.6:80"}
self.request = requests.get('https://www.qiushibaike.com/8hr/page/'+str(page)+'/',proxies=self.proxies,headers=self.headers)
def parse_xpath(self,text):
"""
标签匹配函数
:param text: 页面内容
:return: 匹配到的内容
"""
html = lxml.html.fromstring(text)
html_data = html.xpath("//*/div/a[1]/div/span/text()")
return html_data
def save_info(self,data_lists):
"""
保存到文档中
:param data_lists:数据列表
:return:
"""
for i in data_lists:
with open('./txt/01.txt','ab') as f:
f.write(i.encode('utf-8'))
def run(self):
"""
运行函数
:return:
"""
lists = self.parse_xpath(self.request.text)
self.save_info(lists)
parse = ParseXpath(4)
parse.run()
欢迎各位积极评论,本人刚开始做爬虫,希望与各位共同学习,共同进步。