来自.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(深度优先遍历)顺序排列的标签列表。这样可以轻松访问所需的元素。
我正在尝试从包含在类型标题、标题或段落的标签中的网页中抓取文本。当我尝试下面的代码时,根据 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(深度优先遍历)顺序排列的标签列表。这样可以轻松访问所需的元素。