如何使用 BeautifulSoup 从网站中获取所有标题?

Posted

技术标签:

【中文标题】如何使用 BeautifulSoup 从网站中获取所有标题?【英文标题】:How to grab all headers from a website using BeautifulSoup? 【发布时间】:2017-12-17 04:02:11 【问题描述】:

我正在尝试从一个简单的网站中获取所有标题。我的尝试:

from bs4 import BeautifulSoup, SoupStrainer
import requests

url = "http://nypost.com/business"
page = requests.get(url)
data = page.text
soup = BeautifulSoup(data)
soup.find_all('h')

soup.find_all('h') 返回[],但如果我执行soup.h1soup.h2 之类的操作,它会返回相应的数据。我只是错误地调用了方法吗?

【问题讨论】:

你不应该做soup.find_all('h1')soup.find_all('h2')吗? 【参考方案1】:

按正则表达式过滤:

soup.find_all(re.compile('^h[1-6]$'))

此正则表达式查找以h 开头、h 后有一个数字、然后在该数字后结束的所有标签。

【讨论】:

我终于更了解这个库了...有没有办法知道有多少位数? 我的正则表达式只允许一个,从 1 到 6。html 只有从 H1H6 的标题。为什么期待更多?你见过H16的页面吗?! 我完全是新手,刚刚发现HTML最多有6个。谢谢你的帮助~【参考方案2】:

如果您不想使用正则表达式,那么您可能想要执行以下操作:

from bs4 import BeautifulSoup
import requests

url = "http://nypost.com/business"

page = BeautifulSoup(requests.get(url).text, "lxml")
for headlines in page.find_all("h3"):
    print(headlines.text.strip())

结果:

The epitome of chic fashion is the latest victim of retail's collapse
Rent-a-Center shares soar after rejecting takeover bid
NFL ad revenue may go limp with loss of erectile-dysfunction ads
'Pharma Bro' talked about sex with men to get my money, investor says

And So On------

【讨论】:

【参考方案3】:

当使用 find 或 find_all 方法时,您可以传递一个字符串或标签列表

soup.find_all([f'hi' for i in range(1,7) ])

soup.find_all(['h'.format(i) for i in range(1,7)])

【讨论】:

【参考方案4】:

你需要做soup.find_all('h1')

你可以这样做:

for a in ["h1","h2"]:
  soup.find_all(a)

【讨论】:

这似乎与我所寻找的最接近。我注意到这个站点有 h1、h2、h3、h4(通过手动输入)。在其他情况下,我怎么知道存在的“h”的数量? 好吧,从技术上讲,可能有N个h标签,如果你想完全自动化它,那么你可以在一个循环中暴力破解所有h标签,尽管这可能非常非常低效。我不确定有更好的方法来做到这一点。

以上是关于如何使用 BeautifulSoup 从网站中获取所有标题?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 beautifulsoup 从 js 和 Reactjs 获取数据? [复制]

我如何从 BeautifulSoup 中获取 CData

如何使用 beautifulSoup 从网站中提取和下载所有图像?

如何使用python和beautifulsoup4循环抓取网站中多个页面的数据

如何使用 BeautifulSoup 从 Metacritic 网站中提取电影类型

使用 BeautifulSoup 按 id 获取 div 的内容