GeneralNewsExtractor

GeneralNewsExtractor

GeneralNewsExtractor(GNE)是一个通用新闻网站正文抽取模块,会输入一篇新闻网页的 HTML, 输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。GNE在提取今日头条、新浪,腾讯新闻等数百个中文新闻网站上效果非常出色,几乎能够达到100%的准确率。

项目地址: https://github.com/GeneralNewsExtractor/GeneralNewsExtractor?tab=readme-ov-file

在线体验: https://gne.kingname.info/

以下两种方案任选一种即可

  • 使用 pip 安装
    • pip install --upgrade gne
  • 使用 pipenv 安装
    • pipenv install gne
# 提取正文
from gne import GeneralNewsExtractor

html = '''经过渲染的网页 HTML 代码'''

extractor = GeneralNewsExtractor()
result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])
print(result)
{'title': '', 'author': '', 'publish_time': '', 'content': '经过渲染的网页 HTML 代码', 'images': [], 'meta': {}}
# 提取列表页
from gne import ListPageExtractor
html = '''经过渲染的网页 HTML 代码'''
list_extractor = ListPageExtractor()
result = list_extractor.extract(html, feature='列表中任意元素的 XPath')

print(result)
找不到 feature!
[]
# 进取网页html
import requests

resp = requests.get("https://news.sina.com.cn/c/2024-05-11/doc-inauvekr4567174.shtml")

# print(resp.content.decode())

from gne import GeneralNewsExtractor

html = resp.content.decode()

extractor = GeneralNewsExtractor()
result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])

# print(type(result), result)  # <class 'dict'>

import json

json1 = json.dumps(result, ensure_ascii=False)

print(type(json1), json1)
    <class 'str'> {"title": "中美就气候问题进行会谈:双方将开展相关技术合作", "author": "张玉", "publish_time": "2024-05-11T07:21:05+08:00", "content": "5月8日至9日,中美“21世纪20年代强化气候行动工作组”会议在美国华盛顿特区召开。会议由中国气候变化事务特使刘振民和美国总统国际气候政策高级顾问约翰·波德斯塔共同主持,两国相关官员参加会议。\n会议回顾了中美元首旧金山会晤,围绕《关于加强合作应对气候危机的阳光之乡声明》确定的能源转型、甲烷和其他非二氧化碳温室气体、循环经济和资源效率、毁林、低碳省/州和城市等领域开展深入讨论,并就与推动《联合国气候变化框架公约》第二十九次缔约方大会(COP29)在阿塞拜疆巴库成功举办相关的多边议题展开合作。双方分享了各自气候政策和行动的经验与挑战,旨在有效应对气候危机及其影响。\n双方计划在COP29期间举办第二届“甲烷和非二氧化碳温室气体峰会”。双方承诺就部署减排技术、建立或完善各自MRV体系和标准推动开展双边合作和能力建设,以实现在21世纪20年代期间甲烷控排或减排的目标。双方关注到联合国环境规划署国际甲烷排放观测站的甲烷警报与响应系统。双方还将围绕其他非二氧化碳温室气体(包括工业领域氧化亚氮和对流层臭氧前体物质)的测量和减排方案开展技术合作和能力建设。\n双方期待中美地方气候行动高级别活动于5月29日-30日在加州伯克利举办。\n(总台央视记者 盛云)\n点击进入专题:\n中美关系\n责任编辑:张玉", "images": [], "meta": {"sudameta": "dataid:comos:nauvekr4567174", "keywords": "中美,气候危机,中美关系", "tags": "中美,气候危机", "description": "5月8日至9日,中美“21世纪20年代强化气候行动工作组”会议在美国华盛顿特区召开。会议由中国气候变化事务特使刘振民和美..._新浪网", "og:type": "news", "og:title": "中美就气候问题进行会谈:双方将开展相关技术合作", "og:description": "中美就气候问题进行会谈:双方将开展相关技术合作", "og:url": "https://news.sina.com.cn/c/2024-05-11/doc-inauvekr4567174.shtml", "og:image": "http://n.sinaimg.cn/default/feedbackpics/transform/116/w550h366/20180409/zKqg-fyvtmxe2861159.png", "weibo: article:create_at": "2024-05-11 06:45:09", "weibo: article:update_at": "2024-05-11 07:21:05", "article:published_time": "2024-05-11T07:21:05+08:00", "article:author": "央视", "stencil": "PGLS000526", "publishid": "nauvekr4567174", "comment": "sh:comos-nauvekr4567174", "mediaid": "央视", "mobile-agent": "format=wml; url=https://news.sina.cn/2024-05-11/detail-inauvekr4567174.d.html", "referrer": "always", "jspreload": "jspreload", "applicable-device": "pc,mobile", "MobileOptimized": "width", "HandheldFriendly": "true", "msvalidate.01": "0EBC6AF737F6405C0F32D73B4AA6A640", "apple-mobile-web-app-status-bar-style": "black", "viewport": "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"}}
from gne import GeneralNewsExtractor

with open('./test.html' ,'r', encoding='utf-8') as f:
    html = f.read()
    # print(html)

    extractor = GeneralNewsExtractor()
    result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])

    print(result["content"])

    # import json
    # json1 = json.dumps(result, ensure_ascii=False)
    # # print(type(json1), json1)
    # print(json1)

    好的,下面是一个简单的示例代码,它实现了上述需求的一部分功能,您可以参考它来编写自己的代码:`javaimport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.Random;public class IdiomGame extends JFrame implements ActionListener { private JTabbedPane tabbedPane; private JPanel gamePanel; private JLabel idiomLabel, scoreLabel, hintLabel; private JTextField inputField; private JButton confirmButton, hintButton; private ArrayList<String> idiomList; private int score; private String currentIdiom; public static void main(String[] args) { IdiomGame game = new IdiomGame(); game.setVisible(true); } public IdiomGame() { setTitle("成语接龙游戏"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建选项卡 tabbedPane = new JTabbedPane(); getContentPane().add(tabbedPane); // 创建游戏模式面板 gamePanel = new JPanel(); gamePanel.setLayout(new BorderLayout()); tabbedPane.addTab("挑战模式", gamePanel); // 创建成语标签 idiomLabel = new JLabel(); idiomLabel.setFont(new Font("宋体", Font.PLAIN, 20)); idiomLabel.setHorizontalAlignment(SwingConstants.CENTER); gamePanel.add(idiomLabel, BorderLayout.NORTH); // 创建输入框、确认按钮和提示按钮 JPanel inputPanel = new JPanel(); inputPanel.setLayout(new FlowLayout()); inputField = new JTextField(10); inputPanel.add(inputField); confirmButton = new JButton("确认"); confirmButton.addActionListener(this); inputPanel.add(confirmButton); hintButton = new JButton("提示"); hintButton.addActionListener(this); inputPanel.add(hintButton); gamePanel.add(inputPanel, BorderLayout.CENTER); // 创建得分和提示标签 JPanel infoPanel = new JPanel(); infoPanel.setLayout(new GridLayout(1, 2)); scoreLabel = new JLabel("得分: 0"); scoreLabel.setFont(new Font("宋体", Font.PLAIN, 16)); scoreLabel.setHorizontalAlignment(SwingConstants.CENTER); infoPanel.add(scoreLabel); hintLabel = new JLabel(""); hintLabel.setFont(new Font("宋体", Font.PLAIN, 16)); hintLabel.setHorizontalAlignment(SwingConstants.CENTER); infoPanel.add(hintLabel); gamePanel.add(infoPanel, BorderLayout.SOUTH); // 初始化成语列表和分数 idiomList = new ArrayList<>(); idiomList.add("千姿百态"); idiomList.add("天伦之乐"); idiomList.add("饮食男女"); idiomList.add("     相见恨晚     "); score = 0; // 随机选择一个成语作为起始成语 currentIdiom = idiomList.get(new Random().nextInt(idiomList.size())); idiomLabel.setText(currentIdiom); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == confirmButton) { // 获取用户输入的成语 String inputIdiom = inputField.getText().trim(); // 判断成语是否符合规则 if (inputIdiom.length() == 4 && inputIdiom.charAt(0) == currentIdiom.charAt(3)) { // 计算分数并更新得分标签 score += 10; scoreLabel.setText("得分: " + score); // 随机选择一个新的成语作为起始成语 currentIdiom = idiomList.get(new Random().nextInt(idiomList.size())); idiomLabel.setText(currentIdiom); // 清空输入框和提示标签 inputField.setText(""); hintLabel.setText(""); } else { // 显示错误提示 JOptionPane.showMessageDialog(this, "成语不符合规则,     请     重新输入!", "错误", JOptionPane.ERROR_MESSAGE); } } else if (e.getSource() == hintButton) { // 随机选择一个提示 String hint = "下一个字是" + currentIdiom.charAt(3); hintLabel.setText(hint); } }}`这个代码实现了一个简单的成语接龙游戏,包括了选择游戏模式、显示成语、输入成语、判断成语是否符合规则、计算分数、随机选择新的成语、显示提示等功能。您可以运行它来看看效果。当然,它还有很多不足之处,需要根据您的具体需求进行修改和完善。