用Selenium和Python从HTML中删除动态元素

0 人关注

我已经用BeautifulSoup在页面的HTML中找到一个特定的div类。我想检查这个 div 里面是否有一个 span 类。如果这个 div 有 span 类,我想在页面的代码中保留它,但如果它没有,我想删除它,也许可以使用 Selenium。

为此,我有两个选择元素(div和span)的列表。我试着检查一个列表是否在另一个列表里面,这有点奏效。但怎样才能从页面的源代码中删除那个被发现的元素呢?

在评论区的一些对话之后,我编辑了代码。在帮助下,我能够实现删除元素的代码,执行javascript。

代码正在运行,没有错误,但没有任何东西从页面上被删除。

# Import required module
from selenium import webdriver 
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
# Option to launch browser in incognito
options = Options()
options.add_argument("--incognito")
#options.add_argument("--headless")
# Using chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
# Web page url request
driver.get('https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=BR&q=frete%20gr%C3%A1tis%20aproveite&sort_data[direction]=desc&sort_data[mode]=relevancy_monthly_grouped&search_type=keyword_unordered&media_type=all')
driver.maximize_window()
time.sleep(10)
driver.execute_script("""
  for(let div of document.querySelectorAll('div._99s5')){
    let match = div.innerText.match(/(\d+) ads? use this creative and text/)
    let numAds = match ? parseInt(match[1]) : 0
    if(numAds < 10){
      div.querySelector(".tp-logo")?.remove()
    
5 个评论
你说的删除元素,编辑html的源代码是什么意思?
是的,这是正确的。
你是否想在本地编辑html并保存它--知道你不能从客户端编辑服务器上的源代码?
我可以采用将HTML保存在本地的解决方案,比如说保存在一个文件中。但我不能用Selenium和JavaScript在浏览器上直接编辑HTML吗?很明显,这种改变只发生在运行程序的人身上,而且只发生在可视化的浏览器上。
你的最终目标是什么?
python
selenium
Airã Carvalho da Silva
Airã Carvalho da Silva
发布于 2022-03-11
2 个回答
pguardiario
pguardiario
发布于 2022-03-11
已采纳
0 人赞同

因为你反正是在javascript中删除它们。

driver.execute_script("""
  for(let div of document.querySelectorAll('div._99s5')){
    let match = div.innerText.match(/(\d+) ads? use this creative and text/)
    let numAds = match ? parseInt(match[1]) : 0
    if(numAds < 10){
      div.querySelector(".tp-logo")?.remove()
    
我已经编辑了我的帖子,但那是在我看到你的回答之前。我已经贴出了我试图用javascript来实现的两个方案。我认为你的方案更好。但是,这些元素并没有从页面上删除。代码运行没有错误,但在浏览器上没有发生任何事情。
另外,我没有在我的问题上提到,所以请原谅我,但我正在寻找的字符串,即 "广告使用这个创意和文本",并不是我在删除之前唯一要检查的东西。这个字符串前面有一个数字,比如。"15个广告使用这个创意和文本"。我必须检查这个数字是否大于10,比如说。我必须把整个字符串取出来,只得到数字。我知道这个元素的类别,它是一个具有特定类别编号的span。
我已经用伪代码写了这个,你能帮我写一下javascript部分吗? driver.execute_script(""" for(let div of document.querySelectorAll('div._99s5')){ if(!div.innerText.match("ads use this creative and text")){ div.querySelector(".tp-logo")?.remove() } if((element with span class).replace(/\D/g, "") < 10)){ div.querySelector(".tp-logo")?.remove() } } """)
检查我的更新
代码运行时没有错误,但没有任何元素被从页面上删除。我在原问题上添加了我正在使用的完整代码。你能检查一下,看看我是否遗漏了什么吗?
HedgeHog
HedgeHog
发布于 2022-03-11
0 人赞同

Note: 问题和评论读起来有点混乱,所以如果能改善一下就好了。假设你喜欢 decompose() 一些元素,为什么或者在这个动作之后要做什么并不清楚。所以这个答案只会指出一个问题。