过滤掉具有“display:none”作为标签属性或在其 CSS 中的 HTML 元素

Posted

技术标签:

【中文标题】过滤掉具有“display:none”作为标签属性或在其 CSS 中的 HTML 元素【英文标题】:Filtering out HTML elements which have 'display:none' either as a tag attribute or in their CSS 【发布时间】:2016-02-09 10:04:09 【问题描述】:

假设您有一些用 Selenium 抓取并用 BeautifulSoup 解析的 html 源代码:

from selenium import webdriver
from bs4 import BeautifulSoup

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

有没有办法从 html 代码或汤对象中删除所有具有以下内容的元素:

1.) html 标签源中的属性style=display:none(即<div style = 'display:none'>...</div>

2.) 在页面的 CSS 中具有 display:none 属性

【问题讨论】:

您能否详细说明您的最终目标 - 可能会让我们更容易提供帮助?谢谢! @alecxe - 谢谢,alecxe - 我正在尝试从代理列表 here 中抓取 IP 地址。该页面似乎通过在包含感兴趣信息的元素周围放置 display:none 元素来掩盖 IP 地址的 HTML 代码。 【参考方案1】:

我想我记得处理过这样的网站 - IP 地址在内部通过多个 HTML 元素表示,其中一些通过 display: none 样式隐藏,一些具有适当的 CSS 类使它们不可见。通过BeautifulSoup 从这个混乱中获取真正的 IP 地址非常困难。

好消息是 selenium 实际上处理了这个用例,每当你得到 WebElement.text - 它会返回一个元素的可见文本,这正是需要。

演示:

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

【讨论】:

完美 - 谢谢!我想我应该更多地探索 Selenium 的解析功能,而不是坚持使用我已经习惯的 BeautifulSoup。

以上是关于过滤掉具有“display:none”作为标签属性或在其 CSS 中的 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

css列表属性与display属性

display属性剖析

display_15属性

JS如何过滤掉table中的thead标签, 急!

div class="" style="display:none"是啥意思啊?

display属性