过滤掉具有“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 元素的主要内容,如果未能解决你的问题,请参考以下文章