使用beautifulsoup和python从任何网页提取主文本

bvuwiixz  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(444)

我正在编写一些代码(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))

因此,我正在寻找一种聪明的方法来过滤掉不在主要文章中的段落。这是至关重要的,这种方法可以应用于任何网页,因为我使用这个代码约100随机网站。我已经研究过的事情是过滤包含某些单词的段落,但是我不想这样做,因为这样会遗漏很多信息/段落。此外,我一直在考虑用某些名称(例如:https://matix.io/extract-text-from-webpage-using-beautifulsoup-and-python/),但我发现这不是很有效。。
有人知道如何优雅地做这件事吗?谢谢

p5cysglq

p5cysglq1#

解决这个问题没有明智的办法。每个网站都有自己的结构和惯例。你可以尝试一些正则表达式的黑名单方法,但没有一种会让你高兴。我知道你的问题是问如何使用bs4,但我会建议另一种方法,即trafilatura,如下所示:

pip install trafilatura
import trafilatura
downloaded = trafilatura.fetch_url('your url here')
trafilatura.extract(downloaded)

它以字符串形式返回页面的干净内容,而且速度很快!
此处参考:https://trafilatura.readthedocs.io/en/latest/

相关问题