来自.HTML的文本遍历解析

Traversal Parsing of Text from .HTML

我正在尝试从包含在类型标题、标题或段落的标签中的网页中抓取文本。当我尝试下面的代码时,根据 url 的来源,我得到了不同的结果。当我尝试一些来源(例如维基百科或路透社)时,代码或多或少可以正常工作,至少可以找到所有文本。对于其他来源(例如 Politico、The Economist),我开始错过网页中包含的很多文本。

我正在使用遍历算法遍历树并检查标签是否为 'of interest'。也许 find_all(True, recursive=False) 由于某种原因丢失了 children,而后者随后包含我要查找的文本?我不确定如何调查。或者也许某些网站以某种方式阻止了抓取?但是那为什么我能从经济学家那里刮一段呢?

下面的代码为我复制了问题 - 你应该看到维基百科页面 (urls[3]) 按需要打印,politico (urls[0]) 缺少文章中的所有文本和经济学家 (urls[1]) 除了一个段落外,其他都没有。

from bs4 import BeautifulSoup
import requests

urls = ["https://www.politico.com/news/2022/01/17/democrats-biden-clean-energy-527175", 
        "https://www.economist.com/finance-and-economics/the-race-to-power-the-defi-ecosystem-is-on/21807229",
        "https://www.reuters.com/world/significant-damage-reported-tongas-main-island-after-volcanic-eruption-2022-01-17/",
        "https://en.wikipedia.org/wiki/World_War_II"]

# get soup
url = urls[0] # first two urls don't work, last two do work
response = requests.get(url)
soup = BeautifulSoup(response.text, features="html.parser")

# tags with text that i want to print
tags_of_interest = ['p', 'title'] + ['h' + str(i) for i in range(1, 7)]

def read(soup):
    for tag in soup.find_all(True, recursive=False):

        if (tag.name in tags_of_interest): 
            print(tag.name  + ": ", tag.text.strip())

        for child in tag.find_all(True, recursive=False):
            read(child)

# call the function
read(soup)

BeautifulSoup 的 find_all() 将 return 按照此答案 here 的 DFT(深度优先遍历)顺序排列的标签列表。这样可以轻松访问所需的元素。