【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素,一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。

但是有时候如果网页多了一些弹窗或者啥之类的,绝对位置会发生变化,使用xpath等方法,需要经常变动。

于是我在想,能不能让selenium也能像Beautifulsoup一样,可以根据html的结构找到需要的部分,并解析出来。

方法:

  1. 复制那里的css_selector
  2. 对比css_selector的构建和html上的元素的上下位置
python 复制代码
products=page_soup.find('div', {'id': 'List'}).ul.findAll("li") #找到最大的那个位置
for product in products:
    # 提取商品链接
    link_element = product.find_element(By.CSS_SELECTOR, "p-name  a")
        product_link = link_element.get_attribute("href")
        product_title = link_element.get_attribute("title")

写法类似beautifulsoup的写法。

  1. 如果想要多个条件并列,写法:
python 复制代码
   tags_elements = product.find_elements(By.CSS_SELECTOR, "div.p-icons img, div.p-icons i")

这个是想同时获得icons 下的img 和i 的节点元素的内容。

  1. 提取上一级或者下一级的写法:

例如:提取 div 的p-icons的,下一级元素img;

css_selector : #J_pro_100151669791 > img:nth-child(1)

在div class为"p-icons"下的

具体写法:

python 复制代码
 tags_elements = product.find_elements(By.CSS_SELECTOR, "div.p-icons  img:nth-child(1)")
  1. 提取其中的具体标签值,例如 像上面的desc的:
python 复制代码
for tag_element in tags_elements:
    tag = tag_element.get_attribute("desc") or tag_element.text
    if "XX超市" in tag or "五星旗舰店" in tag or "自营" in tag:
        tags.append(tag.strip())

可以批量判断是否为这个标签值


总的写法:

python 复制代码
for product in products:
    print()
    # 提取商品链接 
    link_element = product.find_element(By.CSS_SELECTOR, "div.p-name a")
    #print('提取商品链接:',link_element)

    #产品链接 产品名称
    product_link = link_element.get_attribute("href") #产品链接
    product_title = link_element.text #产品名称
    print(product_title)
    print('提取商品链接:',product_link)

    #价格     
    product_price_element = product.find_element(By.CSS_SELECTOR, "div.p-price i")
    product_price = product_price_element.text if product_price_element else "无"
    print(product_price)

    #评价数 #warecard_10116099611938 > div.p-commit > strong
    comment_count_element = product.find_element(By.CSS_SELECTOR, "div.p-commit a")
    comment_count = comment_count_element.text if comment_count_element else "无"
    print(comment_count)
    
    # 提取店铺名称
    shop_name_element = product.find_element(By.CSS_SELECTOR, "div.p-shop a, div.p-shop span")  ##warecard_10129282745285 > div.p-shop > span
    shop_name = shop_name_element.text if shop_name_element else "无"
    print(shop_name)


    #划线价
    original_price= is_exist_element(product,"div.p-price span.originalPrice")
    print(original_price)
    
   
    #自营
    is_self_operated = is_extact_element_element(product,"div.p-name.p-name-type-2 img","alt","自营")
    print(is_self_operated)
    

    #X东超市
    is_jd_supermarket = is_extact_element_element(product, "div.p-icons img","desc",'XX超市')
    print(is_jd_supermarket)
    
    #5星店铺  
    is_five_star = is_element(product,"div.p-shop img")
    print(is_five_star)
相关推荐
灿飞屋1 小时前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack
一晌小贪欢3 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
一条大祥脚4 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
10年前端老司机4 小时前
Milvus 8种检索能力实践
数据库·python·agent
Sakura_j_h_5 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰5 小时前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境5 小时前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530146 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
hhcgchpspk6 小时前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事6 小时前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python