我正在尝试查找并打印所有包含我感兴趣的月份的h3标签。为此,我尝试对我的bs4对象(head
)和其中的if语句进行一个for循环。指定打印满足条件的行;在这种情况下,如果该行中包含一个字符串(月份),则为这种情况。我遇到的问题是,即使我指定的月份存在于bs4对象/行中,也无法在if语句中打印它们。
我尝试将年份加到月份中,这似乎解决了问题,尽管并不理想。另外,我通过制作一些行的简短列表(手动)并使用该列表而不是bs4对象(head
)运行一个for循环来测试方法背后的逻辑
import requests
from bs4 import BeautifulSoup
page=requests.get('https://www.england.nhs.uk/statistics/statistical-work-areas/delayed-transfers-of-care/statistical-work-areas-delayed-transfers-of-care-delayed-transfers-of-care-data-2018-19/')
soup=BeautifulSoup(page.text,'html.parser')
text=soup.find(class_='rich-text')
head = text.find_all('h3')
for row in head:
for r1 in ['January','February']:
if r1 in row:
print(row)
else:
continue
预期结果是
<h3>February 2019</h3>
<h3>January 2019</h3>
我得到的结果不存在,因为什么也没打印出来
答案 0 :(得分:2)
这是因为row
不是字符串类型,而是<class 'bs4.element.Tag'>
。因此in
检查失败。
一种解决方法将强制检查中的字符串:
if r1 in str(row): # or row.text
代码:
for row in head:
for r1 in ['January','February']:
if r1 in str(row): # or row.text
print(row)
我有意避免从else
到if
,因为这样做没有任何目的。
(可选)
for row in head:
if any(r1 in row.text for r1 in ['January','February']):
print(row)
答案 1 :(得分:1)
使用bs4 4.7.1获取DTOC每月出版物的另一种方式
import requests
from bs4 import BeautifulSoup as bs
url = 'https://www.england.nhs.uk/statistics/statistical-work-areas/delayed-transfers-of-care/statistical-work-areas-delayed-transfers-of-care-delayed-transfers-of-care-data-2018-19/'
r = requests.get(url)
soup = bs(r.content, 'lxml')
publications = [item.next_sibling.next_sibling.text for item in soup.select('#main-content p:has(+h3)')][1:]
print(publications)
对于页面:
#main-content p:has(+h3)
p
标签的过滤器,其父元素的ID为main-content
,具有相邻的同级h3
标签。 [1:]
会忽略返回列表中的第一项,因为这不是一个月,而是Statistical Press Notice
标头