Newspaper3k的缺点:如何只抓取文章HTML? Python
Shortcomings of Newspaper3k: How to Scrape ONLY Article HTML? Python
您好,感谢您的帮助,
我一直在使用 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)
根据我的经验,文章标题 被删除 的情况是 100%,但文章 HTML 几乎没有成功 scraped,什么也没有返回。我知道 Newspaper3k 是基于 BeautifulSoup,所以我不希望它起作用并且有点卡住了。有什么想法吗?
编辑:我尝试抓取的大多数网站都是西班牙语
所以我没有发现用 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 的解析器。
然后我们使用CSSselect或选择你想要的数据。在可变标题中,我们使用 select_one
,这将 select 仅是元素列表中的一个,因为有时您的 CSS selector 会为您提供 [=61= 的列表] 标签。如果您不了解 CSS select 或者这里有一些资源。
基本上在标题变量中我们指定了html标签,.
表示一个class名字,所以h1.header-title
会抓取html标签h1 与 class header-title。 >
将您引向 h1 的直接 child,在这种情况下,我们需要 span 元素,即 H1 的 child 元素。
同样在标题变量中,我们有 get_text()
方法从 html 标签中获取文本。然后我们使用string strip方法剥离whitespace.
的字符串
与 sub_title 变量类似,我们正在获取名称为 class 的 div 元素 journal-content-article,我们将直接获取 child html 标记 h2 并抓取它的文本。
author 变量,我们正在 selecting div of class name author 并获取直接 child p 标签。我们正在抓取文本,但底层文本有 autor: NAME
,因此使用拆分字符串方法,我们将该字符串拆分为两个元素的列表,autor
和 NAME
,然后我 select编辑了该列表的第二个元素,然后使用字符串方法 strip,从中删除了所有白色 space。
如果您在抓取特定网站时遇到问题,最好提出一个新问题并向我们展示您尝试过的代码,您的具体数据需求是什么,请尽可能明确。 URL 帮助我们指导您让您的抓取工具正常工作。
您需要使用 Config() class 才能提取文章 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.whosebug.com'
print(url, extract_article_html(url))
您好,感谢您的帮助,
我一直在使用 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)
根据我的经验,文章标题 被删除 的情况是 100%,但文章 HTML 几乎没有成功 scraped,什么也没有返回。我知道 Newspaper3k 是基于 BeautifulSoup,所以我不希望它起作用并且有点卡住了。有什么想法吗?
编辑:我尝试抓取的大多数网站都是西班牙语
所以我没有发现用 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 的解析器。
然后我们使用CSSselect或选择你想要的数据。在可变标题中,我们使用 select_one
,这将 select 仅是元素列表中的一个,因为有时您的 CSS selector 会为您提供 [=61= 的列表] 标签。如果您不了解 CSS select 或者这里有一些资源。
基本上在标题变量中我们指定了html标签,.
表示一个class名字,所以h1.header-title
会抓取html标签h1 与 class header-title。 >
将您引向 h1 的直接 child,在这种情况下,我们需要 span 元素,即 H1 的 child 元素。
同样在标题变量中,我们有 get_text()
方法从 html 标签中获取文本。然后我们使用string strip方法剥离whitespace.
与 sub_title 变量类似,我们正在获取名称为 class 的 div 元素 journal-content-article,我们将直接获取 child html 标记 h2 并抓取它的文本。
author 变量,我们正在 selecting div of class name author 并获取直接 child p 标签。我们正在抓取文本,但底层文本有 autor: NAME
,因此使用拆分字符串方法,我们将该字符串拆分为两个元素的列表,autor
和 NAME
,然后我 select编辑了该列表的第二个元素,然后使用字符串方法 strip,从中删除了所有白色 space。
如果您在抓取特定网站时遇到问题,最好提出一个新问题并向我们展示您尝试过的代码,您的具体数据需求是什么,请尽可能明确。 URL 帮助我们指导您让您的抓取工具正常工作。
您需要使用 Config() class 才能提取文章 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.whosebug.com'
print(url, extract_article_html(url))