易于抓取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'

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android HttpClient cookies   如何使用Java在远程系统上运行SSH命令?   java从字符串数组中的字符串末尾删除“,”   在One plus 3t手机上,当应用程序被终止或从最近的应用程序中刷出时,java Android FCM推送通知不起作用   java如何使垂直滚动条始终位于jtable的末尾   在java中解析迄今为止“未知”的字符串   javascript在Java中获取Nashorn JsonObject   java windows 10和ubuntu可以使用相同的JDK吗?   java在不同的文件中记录不同的日志。但所有日志都放在同一个文件中   具有特定jdk的java Gradle构建项目   xml Java web服务生成错误响应   javascript Jaggery文件更改不显示   java输出二进制搜索树数组   将BufferedReader解析为JSON对象时,java在位置处意外标记文件结尾