使用 Beautiful Soup 提取 css 链接

Posted

技术标签:

【中文标题】使用 Beautiful Soup 提取 css 链接【英文标题】:Extracting css links using Beautiful Soup 【发布时间】:2015-09-18 17:47:27 【问题描述】:

我是 Beautiful Soup 的新手,我想使用它提取网站的 CSS 和 JS 链接。到目前为止,我已经成功了,但有一个小缺陷。

from bs4 import BeautifulSoup
import urllib.request

url="http://www.something.com"
page = urllib.request.urlopen(url)

soup = BeautifulSoup(page.read())
for link in soup.find_all('link'):      #Lists out css links
    print(link.get('href'))

在使用上面的 sn-p 时,我可以获取到 css 文件的所有链接。但是,我还获得了其他链接,例如 favicon。我是 BeautifulSoup 的新手,我想知道是否有任何方法可以将其过滤到仅样式表中。

另外,为了提取 JS,如果我在“脚本”标签上运行一个简单的 find_all,我会以非常不整洁的方式获得 JS 链接以及直接写在脚本标签中的任何 JS。如果我运行一个与我的 CSS 类似的循环,

for link in soup.find_all('script'):        #Lists out all JS links
    print(link.get('src'))

我得到的链接没有直接 JS 写入脚本标签内的文件中。我很确定有更好的方法来提取它,只是我有点困惑。看过这里的href提取链接,对我帮助不大。

我正在尝试使代码对我尝试使用的所有或大多数网站都具有通用性,因此虽然这对我迄今为止使用过的网站有效,但有些网站会将“链接”用于其他内容,而不仅仅是css 链接。因此,如果您有更通用的逻辑或方法可以用来检索网站的 css 链接/JSS 链接和代码,我将不胜感激!

谢谢!

【问题讨论】:

【参考方案1】:

找到所有“链接”元素并过滤掉那些具有此元素rel="stylesheet" 的元素。 您可以使用以下内容:

>>> [link["href"] for link in soup.findAll("link") if "stylesheet" in link.get("rel", [])]

我为我们所在的当前 *** 页面运行了上述代码。 结果:

>>> ['//cdn.sstatic.net/***/all.css?v=00635778dbde']

【讨论】:

稍微编辑了您的代码以仅获取链接。效果很好!非常感谢!【参考方案2】:

您可以将extra parameters 传递给find_all 以进一步过滤您的查询。

试试:

soup.find_all('link', rel="stylesheet")
soup.find_all('script', src=re.compile(".*"))

【讨论】:

以上是关于使用 Beautiful Soup 提取 css 链接的主要内容,如果未能解决你的问题,请参考以下文章

使用Beautiful Soup 4提取特定列表项

用 Beautiful Soup 提取 href

使用 Beautiful Soup 提取链接的等效正则表达式

Beautiful Soup - 在 div 之后提取

如何使用 Beautiful Soup 提取此 HTML 元素属性的值?

Python爬虫学习笔记.Beautiful Soup库的使用