如何使用 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.h1
或soup.h2
之类的操作,它会返回相应的数据。我只是错误地调用了方法吗?
【问题讨论】:
你不应该做soup.find_all('h1')
和soup.find_all('h2')
吗?
【参考方案1】:
按正则表达式过滤:
soup.find_all(re.compile('^h[1-6]$'))
此正则表达式查找以h
开头、h
后有一个数字、然后在该数字后结束的所有标签。
【讨论】:
我终于更了解这个库了...有没有办法知道有多少位数? 我的正则表达式只允许一个,从 1 到 6。html 只有从H1
到 H6
的标题。为什么期待更多?你见过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 从网站中提取和下载所有图像?
如何使用python和beautifulsoup4循环抓取网站中多个页面的数据