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}")
posted @ 2024-07-01 22:25  little小新  阅读(73)  评论(0编辑  收藏  举报