网页详情页通用提取——通用新闻网站正文抽取器

GNE是一款高效的新闻正文抽取工具,支持多种新闻网站,准确率高。输入HTML即可提取标题、正文等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页面标题的爬取 以及页面text的爬取

python 新闻网站通用爬虫

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

from gne import GeneralNewsExtractor

extractor = GeneralNewsExtractor()
html = '网站源代码'
result = extractor.extract(html)
print(result)

安装

pip install gne -i https://mirrors.163.com/pypi/simple/

功能特性

获取正文源代码

在 extract() 方法只传入网页源代码,不添加任何额外参数时,GNE 返回如下字段:

  • title:新闻标题
  • publish_time:新闻发布时间
  • author:新闻作者
  • content:新闻正文
  • images: 正文中的图片(相对路径或者绝对路径)

可能有些朋友希望获取新闻正文所在标签的源代码,此时可以给 extract() 方法传入 with_body_html 参数,设置为 True:

extractor = GeneralNewsExtractor()
extractor.extract(html, with_body_html=True)

总是返回图片的绝对路径

默认情况下,如果新闻中的图片使用的是相对路径,那么 GNE 返回的 images 字段对应的值也是图片相对路径的列表。
如果你想始终让 GNE 返回绝对路径,那么你可以给 extract() 方法增加 host 参数,这个参数的值是图片的域名,例如:

extractor = GeneralNewsExtractor()
extractor.extract(html, host='https://www.kingname.info')

这样,如果新闻中的图片是 /images/pic.png ,那么 GNE 返回时会自动把它变为 https://www.kingname.info/images/pic.png

指定新闻标题所在的 XPath

GNE 预定义了一组 XPath 和正则表达式用于提取新闻的标题。但某些特殊的新闻网站可能无法提取标题,此时,你可以给 extract() 方法指定 title_xpath 参数,用于提取新闻标题:

extractor = GeneralNewsExtractor()
extractor.extract(html, title_xpath='//title/text()')

提前移除噪声标签

某些新闻下面可能会存在长篇大论的评论,这些评论看起来比新闻正文“更像”正文,为了防止他们干扰新闻的提取,可以通过给 extract() 方法传入 noise_node_list 参数,提前把这些噪声节点移除。noise_node_list 的值是一个列表,里面是一个或多个 XPath

extractor = GeneralNewsExtractor()
extractor.extract(html, noise_node_list=['//div[@class="comment-list"]', '//*[@style="display:none"]'])

使用配置文件

API 中的参数 title_xpath 、 host 、 noise_node_list 、 with_body_html 除了直接写到 extract() 方法中外,还可以通过一个配置文件来设置。
请在项目的根目录创建一个文件 .gne ,配置文件可以用 YAML 格式,也可以使用 JSON 格式。

  • YAML 格式配置文件
title:
   xpath: //title/text()
host: https://www.xxx.com
noise_node_list:
   - //div[@class=\"comment-list\"]
   - //*[@style=\"display:none\"]
with_body_html: true
  • JSON 格式配置文件
{
   "title": {
       "xpath": "//title/text()"
   },
   "host": "https://www.xxx.com",
   "noise_node_list": ["//div[@class=\"comment-list\"]",
                       "//*[@style=\"display:none\"]"],
   "with_body_html": true
}

这两种写法是完全等价的。
配置文件与 extract() 方法的参数一样,并不是所有字段都需要提供。你可以组合填写你需要的字段。
如果一个参数,既在 extract() 方法中,又在 .gne 配置文件中,但值不一样,那么 extract() 方法中的这个参数的优先级更高。

FAQ

GeneralNewsExtractor(以下简称 GNE)是爬虫吗?

GNE 不是爬虫,它的项目名称 General News Extractor 表示通用新闻抽取器。它的输入是 HTML,输出是一个包含新闻标题,新闻正文,作者,发布时间的字典。你需要自行设法获取目标网页的 HTML。
GNE 现在不会,将来也不会提供请求网页的功能。

GNE 支持翻页吗?

GNE 不支持翻页。因为 GNE 不会提供网页请求的功能,所以你需要自行获取每一页的 HTML,并分别传递给 GNE。

GNE 支持哪些版本的 Python?

不小于 Python 3.6.0

我用 requests/Scrapy 获取的 HTML 传入 GNE,为什么不能提取正文?

GNE 是基于 HTML 来提取正文的,所以传入的 HTML 一定要是经过 JavaScript 渲染以后的 HTML。而 requests 和 Scrapy 获取的只是 JavaScript 渲染之前的源代码,所以无法正确提取。
另外,有一些网页,例如今日头条,它的新闻正文实际上是以 JSON 格式直接写在网页源代码的,当页面在浏览器上面打开的时候,JavaScript 把源代码里面的正文解析为 HTML。这种情况下,你在 Chrome 上面就看不到 Ajax 请求。
所以建议你使用 Puppeteer/Pyppeteer/Selenium 之类的工具获取经过渲染的 HTML 再传入 GNE。

API

GeneralNewsExtractor 的函数原型为:

class GeneralNewsExtractor:
    def extract(self,
                html,
                title_xpath='',
                host='',
                author_xpath='',
                publish_time_xpath='',
                body_xpath='',
                noise_node_list=None,
                with_body_html=False,
                use_visiable_info=False)

各个参数的意义如下:

  • html(str): 必填,目标网站的源代码
  • title_xpath(str): 可选,新闻标题的 XPath,用于定向提取标题
  • host(str): 可选,图片所在的域名,例如 https://www.kingname.info, 那么,当GNE 从新闻网站提取到图片的相对连接/images/123.png时,会把 host 拼接上去,变成https://www.kingname.info/images/123.png
  • body_xpath(str): 可选,新闻正文所在的标签的 XPath,用于缩小提取正文的范围,降低噪音
  • noise_node_list(List[str]): 可选,一个包含 XPath 的列表。这个列表中的 XPath 对应的标签,会在预处理时被直接删除掉,从而避免他们影响新闻正文的提取
  • with_body_html(bool): 可选,默认为 False,此时,返回的提取结果不含新闻正文所在标签的 HTML 源代码。当把它设置为 True 时,返回的结果会包含字段 body_html,内容是新闻正文所在标签的 HTML 源代码
  • author_xpath(str): 可选,文章作者的 XPath,用于定向提取文章作者
  • publish_time_xpath(str): 可选,文章发布时间的 XPath,用于定向提取文章发布时间
  • use_visiable_info(bool): 可选,HTML 是否带有节点坐标和可视化信息

官网地址:https://generalnewsextractor.readthedocs.io/zh_CN/latest/github地址:https://github.com/GeneralNewsExtractor/GeneralNewsExtractor

### 影刀RPA爬取不规则数据的方法与教程 #### 一、影刀RPA简介及其适用场景 影刀RPA是一款自动化工具,能够模拟人类操作计算机的行为,完成重复性和高频率的任务。对于爬取不规则数据这一需求,可以通过配置影刀RPA中的特定功能模块来实现复杂逻辑的操作[^1]。 --- #### 二、解决不规则数据爬取的核心思路 在面对结构化程度较低或者动态变化频繁的数据源时,传统的固定路径提取方式可能无法满足需求。此时需要引入更灵活的技术手段: 1. **基于OCR技术识别非标准文本** 对于图片形式展示的文字内容(如验证码、截图),可集成光学字符识别(OCR)插件到工作流中,先转换成机可读字符串再进一步解析处理。 2. **利用正则表达式匹配杂乱字段** 针对HTML页面内嵌入的半结构化信息片段,则借助强大的模式匹配算法——即Perl兼容的正则表达式引擎来进行精准定位并抽取目标要素。 3. **自定义脚本增强交互能力** 当遇到某些特殊业务逻辑难以单纯依靠图形界面拖拽构建出来的时候,允许用户编写少量JavaScript代码片段注入至浏览环境执行额外动作就显得尤为重要了。 4. **应对AJAX加载延迟问题** 如果目标网站采用了异步请求更新部分内容而非一次性返回全部DOM树的话,那么就需要设置合理的等待时间间隔直至所需元素完全呈现后再继续后续步骤;另外还可以监听网络通信捕获原始JSON响应包从而绕过前端渲染层直接拿到纯净数据。 --- #### 三、具体实施案例分析 假设我们要从某电商平台上采集商品详情页里的各种属性参数值(名称、价格区间、库存状态等),但由于不同卖家上传模板差异较大造成布局混乱不堪甚至存在隐藏域等情况发生怎么办呢? ##### 解决方案如下所示: ```python from selenium import webdriver import time import re def extract_product_info(url): driver = webdriver.Chrome() try: # 打开网页链接 driver.get(url) # 显式休眠几秒让Ajax充分渲染完毕 time.sleep(5) # 获取整个body区域html代码作为待检索对象 body_html = driver.page_source # 定义多个预设好的正则规则分别对应各类特征项 patterns_dict={ 'title':r'<h\d.*?>(.*?)</h\d>', 'price_range':r'\$([\d\.]+)\s*-\s*\$([\d\.]+)', 'stock_status':r'In Stock|Out of Stock' } result={} for key,pattern in patterns_dict.items(): match=re.search(pattern,body_html,re.IGNORECASE | re.DOTALL ) if match: value=match.group().strip() if len(match.groups())==1 else list(map(str.strip,[g for g in match.groups()])) result[key]=value return result finally: driver.quit() if __name__=='__main__': url='https://example.com/product/abcde' info=extract_product_info(url) print(info) ``` 上述示例程序展示了如何综合运用Selenium库控制真实Chrome实例访问指定URL地址之后,耐心等候一段时间确保所有依赖资源均已加载完成后才开始正式作业过程。接着采用Python内置re模块配合精心设计过的若干条目逐一扫描全文寻找符合条件的结果集最后封装起来供调用方消费使用[^2]。 --- #### 四、注意事项与其他建议 尽管如此先进的智能化平台已经极大地简化了许多繁琐的手动劳动环节,但仍需注意以下几点事项才能更好地发挥其潜力价值最大化效果达到预期目的: - 确认目标站点不存在反爬机制干扰正常运行轨迹; - 提前规划好异常情况下的容错恢复策略以免中断整体进度计划表安排被打乱; - 不断积累经验教训总结规律提炼通用组件便于未来快速复制推广相似项目开发周期缩短成本降低效率提升显著优势明显可见成效立竿见影成果斐然令人满意无比欣慰感慨万千! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值