Фильтрация HTML-элементов, которые имеют 'display:none' либо в качестве атрибута тега, либо в своем CSS



Допустим, у вас есть какой-то html-источник, который был очищен с помощью Selenium и проанализирован с помощью BeautifulSoup:



from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Firefox()
driver.get(url)
soup = BeautifulSoup(driver.page_source)


Есть ли способ удалить из html-кода или объекта soup все элементы, которые либо имеют:



1.) атрибут style=display:none в исходном html-теге (т. е. <div style = 'display:none'>...</div>)



Или



2.) имеют свойство display:none в CSS страницы

584   1  

1 ответ:

Я помню, что имел дело с таким веб-сайтом - IP-адрес был внутренне представлен несколькими элементами HTML, некоторые из них были скрыты через стиль display: none, некоторые имели соответствующий класс CSS, который делал их невидимыми. Получить реальный IP-адрес из этого беспорядка через BeautifulSoup было довольно трудно.

Хорошая новость заключается в том, что selenium фактически обрабатывает этот случай использования, и всякий раз, когда вы получаете .text из WebElement - он вернет вам видимый текст элемента а это именно то, что нужно.

Демо:

In [1]: from selenium import webdriver

In [2]: driver = webdriver.Firefox()

In [3]: driver.get("http://proxylist.hidemyass.com/")

In [4]: for row in driver.find_elements_by_css_selector("section.proxy-results table#listable tr")[1:]: 
   ...:     cells = row.find_elements_by_tag_name("td")
   ...:     print(cells[1].text.strip())
   ...: 
101.26.38.162
120.198.236.10
213.85.92.10
...
216.161.239.51
212.200.111.198

Comments

    Ничего не найдено.