9、爬虫-xpath-selenium爬取网页隐藏元素
安装:pip install lxml
1、导入:from lxml import etree
2、创建对象:
tree = etree.XML(xml文件)
tree = etree.HTML(html文件)
等
3、找标签:
tree.xpath("//book/name/text()")
4、语法:
text()表示取节点标记的文字
tree.xpath("//book/publisher[3]/text()") #因为这里有四个相同的 <publisher> 节点 [下标索引取值]、xpath的下标索引从 1 开始、而不是0
通过标签的属性来取文字 : 标签[@属性="属性值"] tree.xpath("/books/book[2]/li/a[@href='shux']/text()")
取属性的值:@属性 --如:tree.xpath("/books/book[2]/li/a/@href")
tree.xpath("./publisher[3]/text()") #./ 表示相对查找、表示从当前开始查找
"""
使用xpath解析html文本
"""
from lxml import etree
xml = """
<books> <!-- 这是 xml 注释 -->
<book id="SN9787302575443"> <!-- book 标签描述一本图书 id 属性描述 的是图书 的编号 -->
<name>Java 2实用教程(第6版)</name> <!-- name 标签描述 的是图书 的信息 -->
<author>耿祥义、张跃平</author> <!-- author 单词是作者的意思 ,描述图书作者 -->
<publisher>清华大学出版社</publisher> <!--publisher 单词是出版社的意思,描述图书的出版社-->
<publisher>清华大学出版社2</publisher> <!--publisher 单词是出版社的意思,描述图书的出版社-->
<publisher>清华大学出版社3</publisher> <!--publisher 单词是出版社的意思,描述图书的出版社-->
<publisher>清华大学出版社4</publisher> <!--publisher 单词是出版社的意思,描述图书的出版社-->
<price>65</price> <!-- price 单词是价格,描述的是图书 的价格 -->
</book>
<book id="SN9787020122172"> <!-- book 标签描述一本图书 id 属性描述 的是图书 的编号 -->
<name>骆驼祥子</name> <!-- name 标签描述 的是图书 的信息 -->
<author>老舍</author> <!-- author 单词是作者的意思 ,描述图书作者 -->
<publisher>人民文学出版社</publisher> <!--publisher 单词是出版社的意思,描述图书的出版社-->
<price>20.20</price><!-- price 单词是价格,描述的是图书 的价格 -->
<li><a href="shux">属性值</a></li>
</book>
</books>
"""
#创建对象、指定解析XML文本
tree = etree.XML(xml)
#查找Java 2实用教程(第6版) 和 骆驼祥子 文字
#这里按照节点来一层一层取查找 //表示 从匹配选择的当前节点选择文档中的节点
#text() 表示拿到接待你标记的文字
result1 = tree.xpath("//book/name/text()")
#//也可表示包含所有节点
result2 = tree.xpath("//book//publisher/text()")
#这里的*表示通配符,包含所有节点的意思
result3 = tree.xpath("//book/*/text()")
#取清华大学出版社3、可以通过下标索引来取 [3]
result4 = tree.xpath("//book/publisher[3]/text()") #因为这里有四个相同的 <publisher> 节点
#取a标签里的属性值为shux的文字、通过标签的属性来取文字 标签[@属性="属性值"]
result5 = tree.xpath("/books/book[2]/li/a[@href='shux']/text()")
#取属性的值:href的值
result6 = tree.xpath("/books/book[2]/li/a/@href")
print(result1)
print(result2)
print(result3)
print(result4)
print(result5)
print(result6)
案例
"""
使用xpath捞取猪八戒网络里的saas平台商家信息
网站:https://www.zbj.com/fw/?k=saas
拿到价格、标题、所在城市、店铺名
"""
import requests
from lxml import etree
url = "https://www.zbj.com/fw/?k=saas"
#拿到html文本
response = requests.get(url)
print(response.text)
#创建xpath的html对象
html_file = etree.HTML(response.text)
#先取第一层
html_one = html_file.xpath('//*[@id="__layout"]/div/div[3]/div/div[4]/div/div[2]/div[1]/div')
#取每一个店铺的商家名
for html in html_one:
#店铺名
storeshop = html.xpath("./div/a/div[2]/div/div/text()")
#价格
price = html.xpath('./div/div[@class="bot-content"]/div[@class="price"]/span/text()')
#服务、标题
server_name = html.xpath('./div/div[@class="bot-content"]/div[@class="name-pic-box"]/a/text()')
#所在地
address = html.xpath('./div/div[@class="card-box"]/a/div[@class="bot-content bot-evalue" and not(@style="display: none;")]/div[@class="tabstwo"]/span[2]/text()')
print(f"店铺:{storeshop} 所在地:{address} 服务:{server_name} 价格:{price}")
#注意这里的所在地由于在源码中是被隐藏的:display:none属性的、所以使用requests是获取不到的、得使用selenium中的webdriver.Chrom才能获取到完整得html源码
如下:使用selenium库获取html中被隐藏得标签的值
from selenium import webdriver
from lxml import etree
# 创建一个浏览器对象
driver = webdriver.Chrome() # 这里使用Chrome浏览器,您也可以选择其他浏览器
# 使用浏览器加载网页
driver.get('https://www.zbj.com/fw/?k=saas') # 替换为您要访问的网址
# 等待页面加载完成(可选)
# 如果页面中包含动态内容,您可能需要等待一些时间,以确保所有内容都加载完成
# 例如,可以使用以下代码等待5秒钟:
# import time
# time.sleep(5)
# 获取完整的HTML代码
html = driver.page_source
# 关闭浏览器
driver.quit()
#print(html)
# 处理HTML代码
# 在这里,您可以使用lxml或其他库来解析和提取所需的内容
html_file = etree.HTML(html)
#先取第一层
html_one = html_file.xpath('//*[@id="__layout"]/div/div[3]/div/div[4]/div/div[2]/div[1]/div')
#取每一个店铺的商家名
for html in html_one:
#店铺名
storeshop = html.xpath("./div/a/div[2]/div/div/text()")
#价格
price = html.xpath('./div/div[@class="bot-content"]/div[@class="price"]/span/text()')
#服务、标题
server_name = html.xpath('./div/div[@class="bot-content"]/div[@class="name-pic-box"]/a/text()')
#所在地
address = html.xpath('./div/div[@class="card-box"]/a/div[2]/div[@class="tabstwo"]/span[2]/text()')
print(f"店铺:{storeshop} 所在地:{address} 服务:{server_name} 价格:{price}")