gne

新闻网页正文通用抽取器 Beta 版.

https://github.com/generalnewsextractor/generalnewsextractor

Science Score: 13.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (5.0%) to scientific vocabulary

Keywords

python3 webcrawler webspider

Keywords from Contributors

transformation sequencing cameratrap energy-system-model energy-system annotation autograd charts embedded distributed
Last synced: 6 months ago · JSON representation

Repository

新闻网页正文通用抽取器 Beta 版.

Basic Info
  • Host: GitHub
  • Owner: GeneralNewsExtractor
  • License: gpl-3.0
  • Language: Python
  • Default Branch: master
  • Homepage: https://gnepro.kingname.info/
  • Size: 17.4 MB
Statistics
  • Stars: 3,753
  • Watchers: 83
  • Forks: 537
  • Open Issues: 28
  • Releases: 16
Topics
python3 webcrawler webspider
Created over 6 years ago · Last pushed 9 months ago
Metadata Files
Readme Changelog License

README.md

GNE

Star History

Star History Chart

项目起源

开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》

这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现,所以我使用 Python 根据论文实现了这个抽取器。并分别使用今日头条、网易新闻、游民星空、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻做了测试,发现提取效果非常出色,几乎能够达到100%的准确率。

项目现状

在论文中描述的正文提取基础上,我增加了标题、发布时间和文章作者的自动化探测与提取功能。

目前这个项目是一个非常非常早期的 Demo,不能保证每个版本向下兼容,升级之前请特别注意。发布出来是希望能够尽快得到大家的使用反馈,从而能够更好地有针对性地进行开发。

本项目取名为抽取器,而不是爬虫,是为了规避不必要的风险,因此,本项目的输入是 HTML,输出是一个字典。请自行使用恰当的方法获取目标网站的 HTML。

本项目现在不会,将来也不会提供主动请求网站 HTML 的功能。

如何使用

在线体验

如果你想先体验 GNE 的提取效果,那么你可以访问http://gne.kingname.info/。 一般情况下,你只需要把网页粘贴到最上面的多行文本框中,然后点提取按钮即可。通过附加更多的参数,可以让提取更精确。具体 参数的写法与作用,请参阅 API

使用环境

如果你想体验 GNE 的功能,请按照如下步骤进行:

安装 GNE

```bash

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

使用 pip 安装

pip install --upgrade gne

使用 pipenv 安装

pipenv install gne

```

使用 GNE

提取正文

```python

from gne import GeneralNewsExtractor

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

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

{"title": "xxxx", "publish_time": "2019-09-10 11:12:13", "author": "yyy", "content": "zzzz", "images": ["/xxx.jpg", "/yyy.png"]} ```

更多使用说明,请参阅 GNE 的文档

提取列表页(测试版)

```python

from gne import ListPageExtractor html = '''经过渲染的网页 HTML 代码''' listextractor = ListPageExtractor() result = listextractor.extract(html, feature='列表中任意元素的 XPath") print(result) ```

开发环境

如果你需要参与本项目的开发,请按照如下步骤进行。

如果你只想阅读源代码,请现在直接按下键盘上的句号键(就是问号左边那个),可以获得更好的阅读体验。

本项目使用 Pipenv管理 Python 的第三方库。如果你不知道 Pipenv 是什么,请点我跳转

安装完成Pipenv以后,按照如下步骤运行代码:

bash git clone https://github.com/kingname/GeneralNewsExtractor.git cd GeneralNewsExtractor pipenv install pipenv shell python3 example.py

特别说明

项目代码中的example.py提供了本项目的基本使用示例。

  • 本项目的测试代码在tests文件夹中
  • 本项目的输入 HTML 为经过 JavaScript 渲染以后的 HTML,而不是普通的网页源代码。所以无论是后端渲染、Ajax 异步加载都适用于本项目。
  • 如果你要手动测试新的目标网站或者目标新闻,那么你可以在 Chrome 浏览器中打开对应页面,然后开启开发者工具,如下图所示:

Elements标签页定位到<html>标签,并右键,选择Copy-Copy OuterHTML,如下图所示

  • 当然,你可以使用 Puppeteer/Pyppeteer、Selenium 或者其他任何方式获取目标页面的JavaScript渲染后的源代码。

  • 获取到源代码以后,通过如下代码提取信息:

``` python from gne import GeneralNewsExtractor

extractor = GeneralNewsExtractor() html = '你的目标网页正文' result = extractor.extract(html) print(result) ```

  • 如果标题自动提取失败了,你可以指定 XPath:

```python from gne import GeneralNewsExtractor

extractor = GeneralNewsExtractor() html = '你的目标网页正文' result = extractor.extract(html, title_xpath='//h5/text()') print(result) ```

对大多数新闻页面而言,以上的写法就能够解决问题了。

但某些新闻网页下面会有评论,评论里面可能存在长篇大论,它们会看起来比真正的新闻正文更像是正文,因此extractor.extract()方法还有一个默认参数noise_node_list,用于在网页预处理时提前把评论区域整个移除。

noise_mode_list的值是一个列表,列表里面的每一个元素都是 XPath,对应了你需要提前移除的,可能会导致干扰的目标标签。

例如,观察者网下面的评论区域对应的Xpath 为//div[@class="comment-list"]。所以在提取观察者网时,为了防止评论干扰,就可以加上这个参数:

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

  • 提取新闻列表页的功能是测试功能,请勿用于生产环境。你可以通过Chrome 浏览器开发者工具中的 Copy XPath 来复制列表中任意一项的XPath,如下图所示。

GNE 会根据这一项的 XPath,自动找到这个列表里面其他行的数据。

运行截图

网易新闻

今日头条

新浪新闻

凤凰网

网易新闻首页列表

项目文档

GNE 常见问题 Q&A

已知问题

  1. 目前本项目只适用于新闻页的信息提取。如果目标网站不是新闻页,或者是今日头条中的相册型文章,那么抽取结果可能不符合预期。
  2. 可能会有一些新闻页面出现抽取结果中的作者为空字符串的情况,这可能是由于文章本身没有作者,或者使用了已有正则表达式没有覆盖到的情况。

Todo

  • ~~使用一个配置文件来存放常量数据,而不是直接 Hard Code 写在代码中。~~
  • ~~允许自定义时间、作者的提取Pattern~~
  • ~~新闻文章列表页提取~~
  • 对于多页的新闻,允许传入一个 HTML 列表,GNE 解析以后,自动拼接为完整的新闻正文
  • ~~优化内容提取速度~~
  • ~~测试更多新闻网站~~
  • ……

交流沟通

如果您觉得GNE对您的日常开发或公司有帮助,请加作者微信 mekingname(或扫描下方二维码) 并注明"GNE",作者会将你拉入群。

验证消息:GNE

如果你不用微信,那么可以加入 Telegram 群:https://t.me/joinchat/Bc5swww_XnVR7pEtDUl1vw

论文修订

在使用 Python 实现这个抽取器的过程中,我发现论文里面的公式和方法存在一些纰漏,会导致部分节点报错。我将会单独写几篇文章来介绍这里的修改。请关注我的微信公众号:未闻Code:

致谢

@bigbrother666sh

Owner

  • Name: Gne Project
  • Login: GeneralNewsExtractor
  • Kind: organization
  • Email: contact@kingname.info

Gne is a general news extract engine.

GitHub Events

Total
  • Issues event: 2
  • Watch event: 160
  • Push event: 1
  • Fork event: 15
Last Year
  • Issues event: 2
  • Watch event: 160
  • Push event: 1
  • Fork event: 15

Committers

Last synced: 9 months ago

All Time
  • Total Commits: 110
  • Total Committers: 7
  • Avg Commits per committer: 15.714
  • Development Distribution Score (DDS): 0.173
Past Year
  • Commits: 4
  • Committers: 2
  • Avg Commits per committer: 2.0
  • Development Distribution Score (DDS): 0.25
Top Committers
Name Email Commits
kingname g****h@f****m 91
itskingname 7
qiankunxienb q****e@n****m 5
jindaxiang j****g@1****m 2
dependabot[bot] 4****] 2
Jason Zeng z****u@g****m 2
bigbrother666 z****o@g****m 1
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 67
  • Total pull requests: 38
  • Average time to close issues: 3 months
  • Average time to close pull requests: 9 days
  • Total issue authors: 50
  • Total pull request authors: 6
  • Average comments per issue: 1.88
  • Average comments per pull request: 0.16
  • Merged pull requests: 33
  • Bot issues: 0
  • Bot pull requests: 4
Past Year
  • Issues: 2
  • Pull requests: 0
  • Average time to close issues: 1 minute
  • Average time to close pull requests: N/A
  • Issue authors: 2
  • Pull request authors: 0
  • Average comments per issue: 0.0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • kingname (11)
  • shishiwie (3)
  • rottengeek (2)
  • liangbaika (2)
  • siryang2006 (2)
  • shanliangLS (2)
  • ymj4023 (2)
  • dawei101 (1)
  • asyncins (1)
  • lemonsuan (1)
  • breeef (1)
  • billgetjoy (1)
  • Rockyzsu (1)
  • 46319943 (1)
  • linchen059 (1)
Pull Request Authors
  • kingname (30)
  • dependabot[bot] (4)
  • jindaxiang (1)
  • bigbrother666sh (1)
  • Sunxiaoni (1)
  • MICHAELZYY (1)
  • phantomSuying (1)
Top Labels
Issue Labels
bug (40) enhancement (11) help wanted (2) invalid (1)
Pull Request Labels
dependencies (4)

Packages

  • Total packages: 4
  • Total downloads:
    • pypi 681 last-month
  • Total dependent packages: 0
    (may contain duplicates)
  • Total dependent repositories: 9
    (may contain duplicates)
  • Total versions: 22
  • Total maintainers: 2
pypi.org: gne

General extractor of news pages.

  • Versions: 16
  • Dependent Packages: 0
  • Dependent Repositories: 8
  • Downloads: 673 Last month
Rankings
Stargazers count: 1.4%
Forks count: 2.3%
Average: 4.8%
Dependent repos count: 5.2%
Downloads: 5.2%
Dependent packages count: 10.1%
Maintainers (1)
Last synced: 6 months ago
proxy.golang.org: github.com/GeneralNewsExtractor/GeneralNewsExtractor
  • Versions: 2
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Dependent packages count: 6.5%
Average: 6.7%
Dependent repos count: 7.0%
Last synced: 6 months ago
proxy.golang.org: github.com/generalnewsextractor/generalnewsextractor
  • Versions: 2
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Dependent packages count: 6.5%
Average: 6.7%
Dependent repos count: 7.0%
Last synced: 6 months ago
pypi.org: gne-ren

General extractor of news pages.

  • Versions: 2
  • Dependent Packages: 0
  • Dependent Repositories: 1
  • Downloads: 8 Last month
Rankings
Stargazers count: 1.4%
Forks count: 2.3%
Dependent packages count: 10.1%
Dependent repos count: 21.6%
Average: 23.6%
Downloads: 82.6%
Maintainers (1)
Last synced: 6 months ago

Dependencies

requirements.txt pypi
  • lxml >=4.8.0
  • numpy >=1.22.4
  • pyyaml >=5.4.1
setup.py pypi
  • lxml *
  • numpy *
  • pyyaml *
Pipfile pypi
  • mypy * develop
  • lxml *
  • numpy *
  • pyyaml *
Pipfile.lock pypi
  • mypy ==0.910 develop
  • mypy-extensions ==0.4.3 develop
  • toml ==0.10.2 develop
  • typing-extensions ==4.0.1 develop
  • lxml ==4.7.1
  • numpy ==1.21.2
  • pyyaml ==5.4.1