我的 if 语句用于在 bs4 标签元素中查找文本失败有什么原因吗?



我正在尝试查找并打印所有包含我感兴趣的月份的h3标签。为此,我尝试对我的 bs4 对象( head ( 进行 for 循环,其中的 if 语句指定打印满足条件的行;在这种情况下,如果行中有字符串(月份(。我遇到的问题是,即使我指定的月份存在于 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>

我得到的结果不存在,因为没有打印出来

这是因为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)

使用 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标题

最新更新