易于抓取html文档的命令行实用程序
screp的Python项目详细描述
一个简单的命令行废弃的SCREP,什么是SCREP?
==
**screp**是一个命令行实用程序,它提供了简单灵活的html文档报废
。它的工作原理是找到一组*锚*(使用
css选择器指定),然后提取与这些锚相关的信息,
可以选择使用一组标准操作对其进行后期处理。对于每个
锚点,它输出一个根据支持格式之一格式化的记录
(csv,json或常规)。
记录为逗号分隔的值行
-*-j json_format_spec*,将每个记录格式化为json对象,将整个
输出为json对象列表
-*-f general_format_spec*,根据一般格式格式化每个记录,其中计算值被替换为它们的规范(类似于bash参数替换)
*primary_selector是一个css选择器,指定*primary anchor*,如下所述,文件可以是本地文件,也可以是绝对url;如果没有指定文件,则读取标准输入。
==
==
**screp**尝试自动执行编写自己的刮刀时所采取的许多步骤,例如:
*获取HTML文档,必要时
*解析html
*在文档的dom中查找感兴趣的区域
*在这些区域周围查找感兴趣的信息
*简单地处理这些信息
*格式化信息
*输出信息
以使用screp,您需要采取一系列步骤:
*告诉screp从何处获取html文档;它可以处理来自web等源的多个
文档,本地文件系统或stdin使用css选择器定义*primary anchor*:这些是通过
访问html文档中感兴趣的记录的元素
*指定输出格式;这意味着指定:
-*terms*,它们是相对于锚
计算的字符串-如何组合这些术语以生成记录;当前screp支持
三种指定格式的方法:
-csv
-json
-常规格式
*也可以定义*辅助锚*,它们是相对于*主锚*计算的元素,可用于以更简洁的方式定义*术语*
换句话说,一个术语是一个锚(主或次),后跟零个或
更多的访问器,后跟零个或更多的过滤器。
*访问器*和*过滤器*(也称为*操作*)是取上一个函数(或锚)的输出值的函数
,如果这是
第一个操作)并输出另一个值。换句话说,它们形成一个管道。
访问器作用于dom元素和元素集(实际上是有序的列表),而过滤器作用于字符串。每个动作都有一个in_类型和一个out_类型。要正确定义术语,操作的out类型需要与以下操作的in类型匹配。
支持的类型为:"string"、"element"、"element\u set"。
actions可以有零个或多个参数。当操作采用参数时,它
被指定为函数::
操作(参数1、参数2、参数3)
s对其最后一个操作的out_类型有限制(也称为术语的out_类型):
*如果在格式规范中使用术语,则其out_类型必须为
"string"
*如果使用术语定义辅助锚定,它的输出类型必须是
"element"
'anchor.祖先(".box").children(".price")'outputs'元素集'
表示当前文档的根
预定义了以下访问器:
**first**[in戋type="element戋set',out戋type="element"]:返回元素集中的第一个
**last**[in戋type="element戋set',out戋type="element"]:返回元素集
**n th(n)**[在元素集中,out_type="element']:返回元素集中的第n个
元素;它还支持负索引,其中-1
表示最后一个元素,-2表示最后一个元素,依此类推
**class**[在元素中,type="element",out_type="string"]:返回
"class"属性的值***id**[in_type="element",out_type="string"]:返回
"id"属性的值***父**[in_type="element",
out戋type="element']:返回当前元素的父元素
**text**[in戋type="element',out戋type="string']:返回由
当前元素
**tag**[in戋type="element'括起的文本,out_type='string']:返回当前元素的标记
**attr(attr_name)**[in_type='element',out_type='string']:返回名为'attr_name'的当前元素属性的值
**desc(css_sel)**[in_type='element',out_type='element_set']:返回
由css选择的当前元素的子元素的顺序列表
由"css-sel"指定的选择器
**fdesc(css-sel)**[输入类型='element',输出类型='element']:等同于
.desc(css-sel)。第一个
**祖先(css-sel)**[输入类型='element',out_type='element_set']:返回满足"css_sel"
**children(css_sel)**[in_type='element'指定的css选择器的当前元素的祖先列表,out_type="element_set"]:返回满足"css_sel"指定的css选择器的当前元素的子元素列表
**psiblings(css_sel)**[in_type="element",out_type="element_set"]:返回满足"css_sel"
**fsiblings(css_sel)**[in_type="element",out_type="element_set"指定的css
当前元素的前面同级的列表:返回当前元素的以下同级的列表满足css
selector指定的css
***同级(css\u sel)**[in_type='element',out_type='element\u set']:返回
满足css selector的当前元素的同级列表
由css\u sel指定的匹配(css\u sel)**[in_type='element\u set',out_type="element_set"]:
过滤一个元素集并返回与"css_sel"指定的css选择器匹配的所有元素
以下筛选器是预定义的:
**upper**[in_type="string",out-type='string']:将字符串转换为大写
**lower**[in-u type='string',out-u type='string']:将字符串转换为小写
**trim**[in-u type='string',out-u type='string']:删除字符串开始和结束处的空格
**strip(chars)**[in-u type='string',out_type="string"]:删除字符串开头和结尾由"chars"指定的字符
**replace(old,new)**[in_type="string",out_type='string']:用'new'
**resub(pattern,repl)**[in_type='string',out_type='string']:执行
正则表达式替换;*模式*和*repl*的格式
由**re.sub**python函数从标准python库中获取;
指定输出格式
======
--
-h选项,可以在输出记录之前指定要输出的csv头。
示例:
-c'$.attr(title),$.parent.desc(".price").text trim'-h'name,price'
——
json输出格式使用-j选项定义。它将输出格式化为一个json对象列表,每个记录一个。*--indent json*平面告诉
screp缩进每个对象。格式指定为逗号分隔的列表,其中*键*表示记录
对象中的JSON键,*值*是术语规范。
-j'text=$.text,ptext=$.parent.text upper,gptext=$.parent.parent.text'
general format
----
,然后general format由包含术语
规范的常规字符串指定。为了区别于一般格式,每个术语
规范都由大括号包围。格式化记录时,每个术语
规范都用该术语的计算值替换。
示例::
-f'某个标题{$.parent.text replace("x","y")}一些中间的{$.tag}一些
尾部的
指定次锚
=========
=>使用-a选项指定次锚。可以有任意数量的
次锚定义。这些定义的格式为
**<;name>;=<;term>;**其中,<;name>;是一个标识符,<;term>;是相对于任何先前定义的锚(主锚或次锚)的术语定义,这些锚
具有输出元素的功能。次锚可以在后面的-a选项中重新定义,但只保留最后一个定义。
次锚示例
'有趣的=$.fdesc(".interest类")'-a
'有趣的=有趣的.parent'
==
**screp**是一个命令行实用程序,它提供了简单灵活的html文档报废
。它的工作原理是找到一组*锚*(使用
css选择器指定),然后提取与这些锚相关的信息,
可以选择使用一组标准操作对其进行后期处理。对于每个
锚点,它输出一个根据支持格式之一格式化的记录
(csv,json或常规)。
记录为逗号分隔的值行
-*-j json_format_spec*,将每个记录格式化为json对象,将整个
输出为json对象列表
-*-f general_format_spec*,根据一般格式格式化每个记录,其中计算值被替换为它们的规范(类似于bash参数替换)
*primary_selector是一个css选择器,指定*primary anchor*,如下所述,文件可以是本地文件,也可以是绝对url;如果没有指定文件,则读取标准输入。
==
==
**screp**尝试自动执行编写自己的刮刀时所采取的许多步骤,例如:
*获取HTML文档,必要时
*解析html
*在文档的dom中查找感兴趣的区域
*在这些区域周围查找感兴趣的信息
*简单地处理这些信息
*格式化信息
*输出信息
以使用screp,您需要采取一系列步骤:
*告诉screp从何处获取html文档;它可以处理来自web等源的多个
文档,本地文件系统或stdin使用css选择器定义*primary anchor*:这些是通过
访问html文档中感兴趣的记录的元素
*指定输出格式;这意味着指定:
-*terms*,它们是相对于锚
计算的字符串-如何组合这些术语以生成记录;当前screp支持
三种指定格式的方法:
-csv
-json
-常规格式
*也可以定义*辅助锚*,它们是相对于*主锚*计算的元素,可用于以更简洁的方式定义*术语*
换句话说,一个术语是一个锚(主或次),后跟零个或
更多的访问器,后跟零个或更多的过滤器。
*访问器*和*过滤器*(也称为*操作*)是取上一个函数(或锚)的输出值的函数
,如果这是
第一个操作)并输出另一个值。换句话说,它们形成一个管道。
访问器作用于dom元素和元素集(实际上是有序的列表),而过滤器作用于字符串。每个动作都有一个in_类型和一个out_类型。要正确定义术语,操作的out类型需要与以下操作的in类型匹配。
支持的类型为:"string"、"element"、"element\u set"。
actions可以有零个或多个参数。当操作采用参数时,它
被指定为函数::
操作(参数1、参数2、参数3)
s对其最后一个操作的out_类型有限制(也称为术语的out_类型):
*如果在格式规范中使用术语,则其out_类型必须为
"string"
*如果使用术语定义辅助锚定,它的输出类型必须是
"element"
'anchor.祖先(".box").children(".price")'outputs'元素集'
表示当前文档的根
预定义了以下访问器:
**first**[in戋type="element戋set',out戋type="element"]:返回元素集中的第一个
**last**[in戋type="element戋set',out戋type="element"]:返回元素集
**n th(n)**[在元素集中,out_type="element']:返回元素集中的第n个
元素;它还支持负索引,其中-1
表示最后一个元素,-2表示最后一个元素,依此类推
**class**[在元素中,type="element",out_type="string"]:返回
"class"属性的值***id**[in_type="element",out_type="string"]:返回
"id"属性的值***父**[in_type="element",
out戋type="element']:返回当前元素的父元素
**text**[in戋type="element',out戋type="string']:返回由
当前元素
**tag**[in戋type="element'括起的文本,out_type='string']:返回当前元素的标记
**attr(attr_name)**[in_type='element',out_type='string']:返回名为'attr_name'的当前元素属性的值
**desc(css_sel)**[in_type='element',out_type='element_set']:返回
由css选择的当前元素的子元素的顺序列表
由"css-sel"指定的选择器
**fdesc(css-sel)**[输入类型='element',输出类型='element']:等同于
.desc(css-sel)。第一个
**祖先(css-sel)**[输入类型='element',out_type='element_set']:返回满足"css_sel"
**children(css_sel)**[in_type='element'指定的css选择器的当前元素的祖先列表,out_type="element_set"]:返回满足"css_sel"指定的css选择器的当前元素的子元素列表
**psiblings(css_sel)**[in_type="element",out_type="element_set"]:返回满足"css_sel"
**fsiblings(css_sel)**[in_type="element",out_type="element_set"指定的css
当前元素的前面同级的列表:返回当前元素的以下同级的列表满足css
selector指定的css
***同级(css\u sel)**[in_type='element',out_type='element\u set']:返回
满足css selector的当前元素的同级列表
由css\u sel指定的匹配(css\u sel)**[in_type='element\u set',out_type="element_set"]:
过滤一个元素集并返回与"css_sel"指定的css选择器匹配的所有元素
以下筛选器是预定义的:
**upper**[in_type="string",out-type='string']:将字符串转换为大写
**lower**[in-u type='string',out-u type='string']:将字符串转换为小写
**trim**[in-u type='string',out-u type='string']:删除字符串开始和结束处的空格
**strip(chars)**[in-u type='string',out_type="string"]:删除字符串开头和结尾由"chars"指定的字符
**replace(old,new)**[in_type="string",out_type='string']:用'new'
**resub(pattern,repl)**[in_type='string',out_type='string']:执行
正则表达式替换;*模式*和*repl*的格式
由**re.sub**python函数从标准python库中获取;
指定输出格式
======
示例:
-c'$.attr(title),$.parent.desc(".price").text trim'-h'name,price'
json输出格式使用-j选项定义。它将输出格式化为一个json对象列表,每个记录一个。*--indent json*平面告诉
screp缩进每个对象。格式指定为逗号分隔的列表,其中*键*表示记录
对象中的JSON键,*值*是术语规范。
-j'text=$.text,ptext=$.parent.text upper,gptext=$.parent.parent.text'
general format
----
,然后general format由包含术语
规范的常规字符串指定。为了区别于一般格式,每个术语
规范都由大括号包围。格式化记录时,每个术语
规范都用该术语的计算值替换。
示例::
-f'某个标题{$.parent.text replace("x","y")}一些中间的{$.tag}一些
尾部的
指定次锚
=========
=>使用-a选项指定次锚。可以有任意数量的
次锚定义。这些定义的格式为
**<;name>;=<;term>;**其中,<;name>;是一个标识符,<;term>;是相对于任何先前定义的锚(主锚或次锚)的术语定义,这些锚
具有输出元素的功能。次锚可以在后面的-a选项中重新定义,但只保留最后一个定义。
次锚示例
'有趣的=$.fdesc(".interest类")'-a
'有趣的=有趣的.parent'