我的if语句在bs4标签元素中查找失败有什么理由吗?

问题描述 投票:-1回答:2

我试图找到并打印包含我感兴趣的月份的所有h3标签。为此,我尝试制作我的bs4对象(head)的for循环,并在其中的if语句指定打印满足的行条件;在这种情况下,如果一个字符串(月份)在行中。我遇到的问题是,即使我指定的月份存在于bs4对象/行中,它们也不会在我的if语句中打印出来。

我已经尝试将这一年添加到这几个月,这似乎解决了这个问题虽然不理想。另外,我测试了我的方法背后的逻辑,通过制作一些行的简短列表(手动)并运行带有该列表的for循环而不是bs4对象(head

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>

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

python if-statement web-scraping beautifulsoup
2个回答
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标题


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)

我故意避免elseif,因为这不起任何作用。

(可选)

for row in head:
    if any(r1 in row.text for r1 in ['January','February']):
        print(row)
© www.soinside.com 2019 - 2024. All rights reserved.