Questions tagged «parsing»

分析(非)结构化数据以将其转换为结构化标准化格式。

5
以稳定高效的方式从网页获取数据
最近,我了解到,使用正则表达式来解析网站的HTML以获取所需的数据并不是最佳方法。 所以我的问题很简单:那么,什么/最好/最有效且通常稳定的方式来获取此数据? 我应该注意: 没有API 没有其他可以从中获取数据的来源(没有数据库,提要等) 无法访问源文件。(来自公共网站的数据) 假设数据是普通文本,显示在html页面的表格中 我目前在我的项目中使用python,但是独立于语言的解决方案/提示会很好。 附带提出一个问题:当通过Ajax调用构建网页时,您将如何处理? 编辑: 在HTML解析的情况下,我知道没有实际的稳定方法来获取数据。页面更改后,解析器就完成了。在这种情况下,我的意思是:一种有效的页面解析方法,只要页面没有变化,它总是可以为我提供相同的结果(显然是针对同一组数据)。
11 data  parsing 

7
解析XML的技术
我总是发现XML有点麻烦处理。我不是在谈论实现XML解析器:我是在谈论使用现有的基于流的解析器,例如SAX解析器,该解析器逐节点处理XML。 是的,为这些解析器学习各种API确实很容易,但是每当我查看处理XML的代码时,我总是发现它有些复杂。根本的问题似乎是XML文档在逻辑上被分离为各个节点,但是数据类型和属性通常与实际数据分离,有时通过多层嵌套。因此,当单独处理任何特定节点时,需要维护许多额外的状态以确定我们在哪里以及下一步需要做什么。 例如,给出一个典型XML文档的片段: <book> <title>Blah blah</title> <author>Blah blah</author> <price>15 USD</price> </book> ...如何确定何时遇到包含书名的文本节点?假设我们有一个简单的XML解析器,它就像一个迭代器,每次调用时,都会为我们提供XML文档中的下一个节点XMLParser.getNextNode()。我不可避免地发现自己正在编写如下代码: boolean insideBookNode = false; boolean insideTitleNode = false; while (!XMLParser.finished()) { .... XMLNode n = XMLParser.getNextNode(); if (n.type() == XMLTextNode) { if (insideBookNode && insideTitleNode) { // We have a book title, so do something with it } …

2
格式化SQL代码的算法
我需要一个用于内部使用的工具,该工具将格式化SQL代码(SQL Server / MySQL)。 有各种各样的第三方工具和在线网站可以执行此操作,但并非完全符合我的需要。 因此,我想编写适合自己需求的工具。 第一个问题是否存在有关应如何格式化SQL代码的标准或约定?(我尝试过的工具采用不同的格式) 第二个问题,我应该如何完成这项任务?首先应该将sql查询转换为某种数据结构,例如Tree吗?

1
为什么GCC从Bison切换到C ++和C的递归下降解析器?
是否有需要的语言更改或某种实际的原因,使得Bison不再合适或不理想? 我在Wikipedia上看到它们切换了,参考了GCC 3.4和GCC 4.1发行说明。 这些发行说明指出: 手写递归下降C ++解析器已替换了以前的GCC版本中的YACC派生的C ++解析器。新的解析器包含改进的基础结构,这些基础结构可用于更好地解析C ++源代码,扩展的处理以及适当语义分析和解析之间的清晰分隔(如果可能)。新的解析器修复了旧解析器中发现的许多错误。 和: 旧的基于Bison的C和Objective-C解析器已被新的更快的手写递归下降解析器取代 我想知道的是他们遇到了什么实际问题,以及为什么使用Bison不可能/不切实际解决问题
10 c++  c  parsing  compiler 


3
编写编译器编译器-使用和功能简介
这是一系列问题的一部分,这些问题的重点是抽象项目的姐妹项目,该项目旨在以框架的形式抽象语言设计中使用的概念。姊妹项目称为OILexer,旨在从语法文件构造解析器,而不在匹配项上使用代码注入。 与这些问题相关的其他一些页面,与结构类型相关,可以在这里查看,以及在这里找到易用性。可以在此处找到与有关框架和适当发布位置的查询相关的元主题。 我现在要开始从给定的语法中提取解析树,然后是递归下降解析器,该解析器使用DFA识别前向路径(类似于ANTLR 4的LL(*)),所以我想我会打开它来获得洞察力。 在解析器编译器中,哪种功能比较理想? 到目前为止,这里是实现的简要概述: 范本 提前预测,知道在给定点上什么是有效的。 规则“非文字化”将规则中的文字取下来,并解析它们来自哪个标记。 非确定自动机 确定性自动机 简单的词法状态机,用于令牌识别 令牌自动化方法: 扫描-用于注释:注释:=“ / *” Scan(“ * /”); 减-对标识符有用:标识符:=减(IdentifierBody,关键字); 确保标识符不接受关键字。 编码-将自动化编码为基数N转换的X系列计数。 UnicodeEscape:=“ \\ u” BaseEncode(IdentifierCharNoEscape,16,4); 使用十六进制4转换以十六进制形式对Unicode进行转义。此与:[0-9A-Fa-f] {4}之间的区别是使用Encode进行的自动化将所允许的十六进制值集限制为IdentifierCharNoEscape的范围。因此,如果给它\ u005c,则编码版本将不接受该值。这样的事情有一个严重的警告:谨慎使用。最终的自动化可能非常复杂。 没有实现的是CST生成,我需要调整确定性自动化以继承适当的上下文才能使此工作正常进行。 对于感兴趣的人,我已经上传了T *y♯项目原始形式的漂亮印刷品。每个文件都应该链接到其他文件,我开始链接各个规则来遵循它们,但是这花了太长时间(自动化起来会更简单!) 如果需要更多上下文,请相应地发布。 编辑5-14-2013:我已经编写了代码,可以在给定语言下为状态机创建GraphViz图。 这是AssemblyPart的GraphViz有向图。语言描述中链接的成员在其相对文件夹中应具有rulename.txt,以及该规则的图。自从我发布示例以来,某些语言描述已更改,这是由于简化了语法。这是一个有趣的graphviz图像。

2
语言解析以查找重要单词
我正在寻找有关如何处理词汇主题的一些投入和理论。 假设我有一个字符串集合,可能只是一个句子,也可能是多个句子。我想将这些字符串解析为最重要的单词,并用分数表示该单词重要的可能性。 让我们看一些我的意思的例子。 范例1: “我真的很想要Keurig,但我买不起!” 这是一个非常基本的示例,只有一个句子。作为一个人,我很容易看到“ Keurig”在这里是最重要的词。另外,“ afford”相对重要,尽管显然不是句子的重点。“我”一词出现了两次,但根本不重要,因为它并没有真正告诉我们任何信息。我可能希望看到像这样的单词/分数哈希: "Keurig" => 0.9 "afford" => 0.4 "want" => 0.2 "really" => 0.1 etc... 范例2: “这是我一生中最好的游泳习惯之一。希望我能保持自己的时光来参加比赛。要是我想起要带上我的非防水手表,那就可以了。” 这个例子有多个句子,因此在整个过程中会有更多重要的单词。如果不重复示例1的重点练习,我可能希望看到其中有两个或三个非常重要的词:“游泳”(或“游泳练习”),“竞争”,“观看”(或“防水”)手表”或“非防水手表”,具体取决于连字符的处理方式)。 举几个这样的例子,您将如何做类似的事情?编程中是否有任何现有的(开源)库或算法已经做到了这一点?


4
我应该如何实现命令处理应用程序?
我想制作一个简单的概念验证应用程序(REPL),该应用程序需要一个数字,然后处理该数字上的命令。 示例:我从1开始。然后我写“ add 2”,它给我3。然后我写“ multiply 7”,它给我21。然后我想知道它是否是素数,所以我is prime在当前数字上写“ ”( 21),这给了我错误。” is odd将使我成真。等等。 现在,对于具有很少命令的简单应用程序,即使是简单的应用程序switch也可以处理命令。但是,如果我想要扩展性,我将如何实现功能?我是否使用命令模式?我是否为该语言构建简单的解析器/解释器?如果我需要更复杂的命令(例如“ multiply 5 until >200”)怎么办?没有重新编译就可以扩展它(添加新命令)的简单方法是什么? 编辑:为了澄清一些事情,我的最终目标不是制作类似于WolframAlpha的东西,而是制作一个(数字列表)处理器。但是,我想一开始慢慢开始(以单个数字开始)。 我想到的是与使用Haskell处理列表的方式类似的方法,但它是一个非常简单的版本。我想知道像命令模式(或等效命令)之类的内容是否足够,还是我必须制作一个新的迷你语言和一个解析器来实现我的目标? Edit2:感谢所有答复,所有这些对我都非常有帮助,但是Emmad Kareem对我的帮助最大,所以我选择它作为答案。再次感谢!

6
解析文件的最佳方法
我正在尝试寻找一种更好的解决方案,以对其中一些著名的文件格式进行解析,例如:EDIFACT和TRADACOMS。 如果您不熟悉这些标准,请查看Wikipedia的以下示例: 参见以下有关用于回答产品可用性请求的EDIFACT消息的示例:- UNA:+.? ' UNB+IATB:1+6XPPC+LHPPC+940101:0950+1' UNH+1+PAORES:93:1:IA' MSG+1:45' IFT+3+XYZCOMPANY AVAILABILITY' ERC+A7V:1:AMD' IFT+3+NO MORE FLIGHTS' ODI' TVL+240493:1000::1220+FRA+JFK+DL+400+C' PDI++C:3+Y::3+F::1' APD+714C:0:::6++++++6X' TVL+240493:1740::2030+JFK+MIA+DL+081+C' PDI++C:4' APD+EM2:0:130::6+++++++DA' UNT+13+1' UNZ+1+1' UNA段是可选的。如果存在,它将指定将用于解释消息其余部分的特殊字符。UNA后面有六个字符,顺序如下: 组件数据元素分隔符(在此示例中:) 数据元素分隔符(此示例中的+) 十进制通知(此示例中的。) 释放字符(此示例中的?) 保留,必须为空格 段终止符(此示例中的') 如您所见,这只是一些以特殊方式格式化的数据等待解析(非常类似于XML文件)。 现在我的系统是建立在PHP之上的,并且我能够为每个段使用正则表达式创建解析器,但是问题不是每个人都能完美地实现标准。 一些供应商倾向于完全忽略可选的细分市场和领域。其他人可能选择发送比其他人更多的数据。这就是为什么我不得不为段和字段创建验证器以测试文件是否正确。 您可以想象我现在正在遇到的正则表达式的噩梦。另外,每个供应商都需要对正则表达式进行很多修改,我倾向于为每个供应商构建一个解析器。 问题: 1-这是解析文件(使用正则表达式)的最佳实践吗? 2-是否有更好的解析文件的解决方案(也许那里有现成的解决方案)?它能否显示缺少的段或文件已损坏? 3-如果仍然要构建解析器,应该使用哪种设计模式或方法? 笔记: 我读过有关yacc和ANTLR的文章,但不知道它们是否符合我的需求!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.