使用 BeautifulSoup 和 Python 从任何网页中提取主要文本

Cro*_*ord 1 html python beautifulsoup web-scraping

我正在编写一些代码(Python)来从网页中抓取文本。我的目标是找到一种方法来过滤/删除网页上不在主文章中的段落(例如广告、其他文章的链接等)。

到目前为止,我一直在使用该.find_all("p")命令仅从文本中提取段落,虽然成功,但也删除了许多不在每篇文章的主体/正文中的基本段落。这是我现在的代码:

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

URLs = [
"https://www.elsoldetoluca.com.mx/local/proponen-sistemas-para-captar-agua-pluvial-en-el-edomex-6585661.html",
"https://www.elsoldetoluca.com.mx/local/agua-de-acuifero-del-valle-de-toluca-solo-debe-ser-para-uso-de-consumo-humano-especialista-4146232.html"
        ]

for url in URLs:
    req = Request(url, headers={"User-Agent": 'Mozilla/5.0'})
    page = urlopen(req)
    paragraphs = []
    htmlParse = BeautifulSoup(page.read(), 'lxml')    
    for para in htmlParse.find_all("p"):
        paragraph = para.get_text().replace("\n", " ")
        paragraphs = paragraphs + [paragraph]
         
    text  = str("\n\n".join(paragraphs)) 
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找一种聪明的方法来过滤掉主文章中没有的段落。重要的是,此方法可以应用于任何网页,因为我在大约 100 个随机网站上使用此代码。我已经研究过的事情是过滤包含某些单词的段落,但是,我宁愿不这样做,因为这样会遗漏很多信息/段落。另外,我一直在考虑省略具有某些名称的 HTML 部分(例如https://matix.io/extract-text-from-webpage-using-beautifulsoup-and-python/),但我发现这不是非常有效...

有人知道如何优雅地做到这一点吗?谢谢!

小智 5

没有聪明的方法来解决这个问题。每个网站都有自己的结构和惯例。您可以尝试使用一些正则表达式的黑名单方法,但它们都不会让您满意。我知道您的问题是问如何使用 bs4 执行此操作,但我会建议另一种方法来执行此操作,即 trafilatura,如下所示:

pip install trafilatura
Run Code Online (Sandbox Code Playgroud)
pip install trafilatura
Run Code Online (Sandbox Code Playgroud)

它以字符串形式返回页面的干净内容,而且速度很快!

参考此处: https: //trafilatura.readthedocs.io/en/latest/