四、xpath表达式

#xpath表达式

#有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法?
#有!那就是XPath,我们可以先将 HTML文件 转换成 XML文档,
#然后用 XPath 查找 HTML 节点或元素。

#我们需要安装lxml模块来支持xpath的操作。

#使用 pip 安装:pip install lxml
#解析字符串形式html
text ='''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">张三</a></li>
         <li class="item-1"><a href="link2.html">李四</a></li>
         <li class="item-inactive"><a href="link3.html">王五</a></li>
         <li class="item-1"><a href="link4.html">赵六</a></li>
         <li class="item-0"><a href="link5.html">老七</a> 
     </ul>
 </div>
'''

from lxml import etree

#etree.HTML()将字符串解析成了特殊的html对象
html=etree.HTML(text)

#将html对象转成字符串
result=etree.tostring(html,encoding="utf-8").decode()

print(result)
#解析本地html
#爬虫中网页处理方式:
#1,在爬虫中,数据获取和数据清洗一体,HTML()
#2、数据获取和数据清洗分开,parse()

from lxml import etree 

#获取本地html文档
html=etree.parse(r"C:\file\hello.html")

result=etree.tostring(html,encoding="utf-8").decode()

print(result)
#获取一类标签
from lxml import etree

html=etree.parse(r"C:\file\hello.html")

result=html.xpath("//a") #获取所有span标签的信息


print(result[0].text)
#获取指定属性的标签

from lxml import etree 

html = etree.parse("c:/file/hello.html")

# result1=html.xpath("//li[@class='item-88']")

result2=html.xpath("//li/a[@href='link2.html']")

print(result2)
from lxml import etree 
#获取标签的属性
html = etree.parse("c:/file/hello.html")
# result1=html.xpath("//li/@class")
result2=html.xpath("//li/a/@href")

for i in result2:
	requests.get(i)
#获取子标签

from lxml import etree 

html = etree.parse("c:/file/hello.html")

result1=html.xpath("//li/a") #获取下一级子标签
result2=html.xpath("//li//span") #获取所有符合条件子标签

#print(result2[1].text)

#获取li标签下a标签里所有的class

result3=html.xpath("//li/a//@class")

print(result3)
#获取标签名和内容

from lxml import etree 

html = etree.parse("c:/file/hello.html")

#获取倒数第二个li元素下a的内容

#result1=html.xpath("//li[last()-1]/a")

# result2=html.xpath("//li/a")
# print(result1[-2].text) #.text获取标签内容


#获取 class 值为 bold 的标签名
result3=html.xpath("//*[@class='bold']")

print(result3[0].tag) #.tag表示获取标签名
#爬取糗事百科段子
import requests
from lxml import etree 

url = 'https://www.qiushibaike.com/'
headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)\
	AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0\
	.2743.116 Safari/537.36',
	'Accept-Language': 'zh-CN,zh;q=0.8'}


response=requests.get(url,headers=headers).text

html=etree.HTML(response)

result1=html.xpath('//div//a[@class="recmd-content"]/@href')

#print(result1)

#https://www.qiushibaike.com/article/121207030

for site in result1:
	xurl="https://www.qiushibaike.com"+site
	response2=requests.get(xurl).text
	html2=etree.HTML(response2)
	result2=html2.xpath("//div[@class='content']")

	print(result2[0].text)
#百度贴吧图片爬虫
import urllib
import urllib.request
from lxml import etree
# 全局取消证书验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


class Spider(object):
    def __init__(self):
        self.beginPage=1
        self.endPage=3
        self.url="http://tieba.baidu.com/f?"
        self.ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}
        self.fileName=1

    #构造url
    def tiebaSpider(self):
        for page in range(self.beginPage,self.endPage+1):
            pn=(page-1)*50
            wo={'pn':pn,'kw':tiebaName}
            word=urllib.parse.urlencode(wo)
            myurl=self.url+word
            self.loadPage(myurl)

    #爬取页面内容
    def loadPage(self,url):
        req=urllib.request.Request(url,headers=self.ua_header)
        data=urllib.request.urlopen(req).read()

        html=etree.HTML(data)
        links=html.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')

        for link in links:
            link="http://tieba.baidu.com"+link
            self.loadImages(link)
            

    #爬取帖子详情页,获得图片的链接
    def loadImages(self,link):
        req=urllib.request.Request(link,headers=self.ua_header)
        data=urllib.request.urlopen(req).read()
        html=etree.HTML(data)
        links=html.xpath('//img[@class="BDE_Image"]/@src')
        for imageslink in links:
            self.writeImages(imageslink)


    #通过图片所在链接,爬取图片并保存图片到本地:
    def writeImages(self,imagesLink):
        print("正在存储图片:",self.fileName,"....")

        image=urllib.request.urlopen(imagesLink).read()

        #保存图片到本地
        file=open(r"/Users/yuanshuai/Desktop/img//"+str(self.fileName)+".jpg","wb")
        file.write(image)

        file.close()

        self.fileName+=1


if __name__ == '__main__':

    tiebaName = input("请输入要爬取的贴吧名:")

    mySpider=Spider()

    mySpider.tiebaSpider()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: XPath (XML Path Language) 是一种在XML文档中查找信息的语言。它是一种路径语言,通过元素和属性的结构来确定其在XML文档中的位置。使用XPath表达式可以选取XML文档中的某一部分。 ### 回答2: XPath表达式指的是用于在XML文档中定位节点的一种语法规则。在使用XPath表达式时,需要遵循一定的规则和语法结构,如节点名称、路径、谓词等。如果一个XPath表达式符合这些规则,那么我们可以说这个XPath表达式是正确的。 一个正确的XPath表达式可以帮助我们准确地定位到XML文档中的某个或某些节点,从而实现对这些节点的读取、修改、删除等操作。使用XPath表达式可以避免遍历整个XML文档的繁琐过程,提高了操作效率和准确性。 在确定一个XPath表达式是否正确时,我们可以通过使用XPath的解析器或者在编程语言中的XPath引擎进行验证。这些工具可以解析XPath表达式并返回匹配的结果集,如果表达式能够完整地解析并返回结果集,那么我们可以确认这个XPath表达式是正确的。 总结来说,XPath表达式是一种用于定位XML文档中节点的语法规则,如果表达式符合规则并且能够返回正确的结果集,我们可以说这个XPath表达式是正确的。 ### 回答3: XPath表达式是一种用于在XML文档中定位和选择节点的语言。它可以通过指定节点的路径或属性来精确地定位所需的节点,可以用于从复杂的XML结构中提取数据或进行数据筛选。 在使用XPath表达式时,首先需要对XML文档的结构有一定的了解,以便能够准确地描述所需节点的路径。XPath表达式通常以根节点("/")作为起点,然后根据节点名称、属性值、层级关系等条件逐步缩小范围,直到选取到目标节点。 验证一个XPath表达式是否正确,通常需要借助XPath表达式评估器或XML解析器来执行。这些工具可以将XPath表达式应用于XML文档,并返回表达式所选择的节点或数据结果。如果能够成功地获取到所需的节点或数据,那么就可以确定该XPath表达式是正确的。 需要注意的是,XPath表达式的正确与否取决于所应用的XML文档结构和具体需求。有时候,一个XPath表达式可能在某个XML文档上是正确的,而在另一个XML文档上却不适用。因此,在使用XPath表达式时,应根据实际情况进行调试和验证,以确保其准确性和有效性。 总之,XPath表达式是一种强大的工具,能够帮助我们更加便捷地在XML文档中定位和提取所需的数据或节点。只要根据XML文档结构和具体需求正确地编写和应用XPath表达式,就可以获得正确的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值