【问题标题】:Shortcomings of Newspaper3k: How to Scrape ONLY Article HTML? PythonNewspaper3k 的缺点:如何只抓取文章 HTML? Python
【发布时间】:2022-01-16 07:41:53
【问题描述】:

您好,感谢您的帮助,

我一直在使用 Python 和 Newspaper3k 来抓取网站,但我注意到有些函数……嗯……没有功能。特别是,我只能抓取大约 1/10 甚至更少网站的文章 HTML。这是我的代码:

from newspaper import Article
url = pageurl.com
article = Article(url, keep_article_html = True, language ='en')
article.download()
article.parse()
print(article.title + "\n" + article.article_html)

发生的情况是文章标题被scraped,根据我的经验,100% 的时间,但文章 HTML 几乎没有成功 scraped,并且没有返回任何内容.我知道 Newspaper3k 是基于 BeautifulSoup 的,所以我不希望它也能工作并且有点卡住了。有什么想法吗?

编辑:我尝试抓取的大多数网站都是西班牙语

【问题讨论】:

  • 你想抓取什么网站?它将帮助指导您如何抓取它。不得不说我从未听说过 Newspaper3k。
  • 感谢您的回复。主要是科学博客、研究论文和科学理论。我应该补充一点,我要废弃的网站主要是西班牙语(我的母语)。这是我未能抓取的页面示例:wellness-spain.com/-/….

标签: python html python-3.x web-scraping python-newspaper


【解决方案1】:

所以我没有发现用beautifulsoup 抓取wellness-spain.com 的问题。该网站没有那么多javascript。这可能会导致 HTML 解析器(如 beautifulsoup)出现问题,因此在抓取网站时应注意关闭 javascript 以查看在抓取之前从浏览器获得的输出。

您没有具体说明您需要该网站的哪些数据,所以我进行了有根据的猜测。

编码示例

import requests 
from bs4 import BeautifulSoup

url = 'http://www.wellness-spain.com/-/estres-produce-acidez-en-el-organismo-principal-causa-de-enfermedades#:~:text=Con%20respecto%20al%20factor%20emocional,produce%20acidez%20en%20el%20organismo'
html = requests.get(url)
soup = BeautifulSoup(html.text,'html.parser')
title = soup.select_one('h1.header-title > span').get_text().strip()
sub_title = soup.select_one('div.journal-content-article > h2').get_text()
author = soup.select_one('div.author > p').get_text().split(':')[1].strip()

代码说明

我们对请求使用 get 方法来获取 HTTP 响应。美丽的汤,需要回复.text。你会经常看到html.content,但这是二进制响应,所以不要使用它。 HTML解析器只是beautifulsoup用来正确解析html的解析器。

然后我们使用 CSS 选择器来选择您想要的数据。在变量标题中,我们使用select_one,它将仅选择元素列表中的一个,因为有时您的 CSS 选择器会为您提供 HTML 标记列表。如果您不了解 CSS 选择器,这里有一些资源。

  1. Video
  2. Article

本质上我们在title变量中指定了html标签,.表示一个类名,所以h1.header-title会抓取带有class header-title的html标签h1。 > 将您引向 h1 的直接子元素,在这种情况下,我们需要作为 H1 子元素的 span 元素。

同样在 title 变量中,我们有 get_text() 方法从 html 标签中获取文本。然后我们使用 string strip 方法去除字符串中的空格。

与 sub_title 变量类似,我们正在抓取类名为 journal-content-article 的 div 元素,我们正在获取直接子 html 标记 h2 并抓取它的文本。

作者变量,我们选择类名作者的div并获取直接子p标签。我们正在抓取文本,但底层文本有autor: NAME,因此使用拆分字符串方法,我们将该字符串拆分为两个元素的列表,autorNAME,然后我选择了该列表的第二个元素,然后使用 string 方法 strip,从中删除任何空格。

如果您在抓取特定网站时遇到问题,最好提出一个新问题并向我们展示您尝试过的代码、您的特定数据需求是什么,并尽可能明确地说明这一点。该 URL 可帮助我们指导您让您的抓取工具正常工作。

【讨论】:

    【解决方案2】:

    您需要使用 Config() 类来提取文章 HTML。这是执行此操作的完整代码。

    import lxml
    from newspaper import Article, Config
    
    
    def extract_article_html(url):
        config = Config()
        config.fetch_images = True
        config.request_timeout = 30
        config.keep_article_html = True
        article = Article(url, config=config)
    
        article.download()
        article.parse()
    
        article_html = article.article_html
    
        html = lxml.html.fromstring(article_html)
        for tag in html.xpath('//*[@class]'):
            tag.attrib.pop('class')
    
        return lxml.html.tostring(html).decode('utf-8')
    
    
    url = 'https://www.stackoverflow.com'
    print(url, extract_article_html(url))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多