"智能"的方式分析和使用网站的数据?
-
11-07-2019 - |
题
一个人如何明智地分析返回的数据搜索结果页面上的?
例如,可以说,我想创建一个网服务,搜索的在线书籍,通过分析的搜索结果中的许多本书提供者的网站。我能得到原HTML数据的网页,并做一些regexs使数据的工作为我的网服务,但如果任何网站的改变格式的网页,我的代码的休息时间!
RSS的确是一个奇妙的选择,但许多网站没有XML/JSON基于搜索。
是否有任何工具包,帮助传播信息的网页自动?一个疯狂的想法将是要有一个模糊AI模块的认识模式搜索结果页上,并且分析的结果,因此...
解决方案
我已经做了一些这方面最近,这里是我的经验。
有三个基本方法:
- Regular Expressions.
- 最灵活、最简单的使用松散的结构化信息和改变格式。
- 很难做到的结构/标记的分析,但容易做的文字匹配。
- 建立验证的数据格式。
- 难以维持比其他人,因为你必须要写一个经常的表达,为每一个图案你要用于提取/变换的文件
- 通常慢于2和3。
- 适用于列出的同样格式的项目
- 一个很好的regex开发和测试工具和一些样品的网页将有所帮助。我有好东西要说RegexBuddy在这里。试试自己的演示。
- 我有过的最成功与此有关。灵活性可以让你的工作与讨厌的,野蛮的,野生HTML代码。
- Convert HTML to XHTML和使用XML提取的工具。 清理HTML,将其转化为法律XHTML,并使用XPath/属/X-什么以查询为XML数据。
- 工具:TagSoup,HTMLTidy,等等
- 质量HTML到XHML转换是非常重要的,并且高度变量。
- 最好的解决方案,如果数据结构是由HTML布局和标签(数据HTML表、列表格/跨组等)
- 最适合越来越链接的结构、嵌套表格、图像,列出了等等
- 应该快于备选案文1,但低于备选方案3.
- 运作良好,如果内容格式的变化/可变,但文件的结构/局没有。
- 如果数据不结构通过HTML tags,你就有麻烦了。
- 可以使用与选项1。
- 析生成器(这些代码等) -创建一个语法分析分析网页。
- 我还没有尝试过这一点,因为它不适用于我(混乱)网页
- 最合适的,如果HTML结构高度结构化的、非常不断的、定期的,并永远不会改变。
- 使用这个,如果有容易描述的模式在文件中,但它们不涉及HTML tags和涉及递归或复杂的行为
- 不需要输入XHTML
- 最快的吞吐量,一般
- 大的学习曲线,但更容易保持
我已经修改 网收获 用于选择2下,但我找到他们的语法可能有点奇怪。混合的XML和一些伪Java脚本语言。如果你喜欢Java,XML等式数据提取(XPath,属)可能票给你。
编辑:如果你使用普通的表达,确保使用图书馆与懒量和捕获。PHP的老年regex图书馆缺乏这些,他们是不可或缺的匹配数据之间开/闭的标签HTML。
其他提示
如果没有一个的固定强> HTML结构解析,我不想保持正则表达式查找的数据。你可能有更多的运气通过构建树合适解析器解析HTML。然后选择元素...这将是更好的可维护性。
显然,最好的方法是从发动机一些XML输出具有固定的标记,可以解析和验证。我想一个HTML解析库的一些“黑暗”探测产生的树会更简单,以保持比正则表达式。
这样,你只需要检查<a href="blah" class="cache_link">...
变成<a href="blah" class="cache_result">...
或什么的。
底线,grepping特定元素与正则表达式将是严峻。更好的方法是构建喜欢网页的模型DOM和寻找“锚”字符数据的标签。
或发送电子邮件以现场陈述的XML API的情况下......你可能会聘请!
你不说你使用什么语言。在Java中的土地,你可以使用 TagSoup 和XPath,以帮助减少痛苦。这里有一个例子来自这个博客一>(当然XPath的可以得到很多更复杂根据您的需求决定):
URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);
我会建议外在的XPath表达式让你有某种程度的保护,如果该网站的变化。
下面是我绝对不会使用到屏幕抓取这个网站的例子的XPath。没办法,不是我:
"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"
你还没有提及其技术堆的使用。如果你分析HTML,我会使用分析的图书馆:
- 美丽的汤 (蟒蛇)
- HTML灵活性组(.NET)
还有web服务,做到你在说什么-商业和自由。他们刮点和提供服务接口。
和一个通用的服务,提供了一些画面刮是雅虎的管道。 以前的计算器问题上,
这是不是万无一失的,但你可能想在一个解析器来看看如美味的汤一>它不会神奇地发现如果布局变化同样的信息,但它更容易了很多,然后写复杂的正则表达式。注意,这是一个Python模块。
不幸的是“刮”是最常见的解决方案,如你所说试图从网站解析HTML。你可以检测到页面,标志警报,为您解决结构性变化,所以在其末端的改变不会导致烧伤的数据。直到语义网是现实的,这几乎是保证大型数据集的唯一途径。
或者,也可以粘到由API所提供的小的数据集。雅虎都很努力通过API(参见YDN)提供可搜索的数据,我认为亚马逊的API开放了很多书数据等等。
希望帮助一点点!
编辑:如果你正在使用PHP,我建议SimpleHTMLDOM
您看着使用HTML处理库? Ruby有一些相当不错的。例如角度来说,Hpricot
通过一个好的图书馆,你可以指定要使用CSS选择器或XPath页面的部分。这将是一个很好的协议更强大的比使用正则表达式。
这角度来说,Hpricot维基示例:
doc = Hpricot(open("qwantz.html"))
(doc/'div img[@src^="http://www.qwantz.com/comics/"]')
#=> Elements[...]
我相信你会发现,做在.NET或Python等类似的事情一个图书馆。
尝试谷歌上搜索屏幕刮+的语言你更喜欢。我知道几个选项的蟒蛇,你可以找到同等的用语:
- 美丽的汤
- 机械化:类似于perl WWW:机械化.给你一个浏览器就像对象ineract的网页
- lxml:蟒蛇结合libwww
- scrapemark:使用模板刮件的页面
- pyquery:可以让你做jQuery查询在xml/xhtml文件
- 抓取器:一个高级别刮和网爬行框架,用于编写蜘蛛爬和分析网页
根据不同的网站上刮你可能需要使用一个或更多的方法上。
如果你可以使用像标记汤,那会是一开始的地方。然后,你可以把网页就像一个XML API,有点。
它有一个Java和C ++实现,可能工作!
欧芹在 http://www.parselets.com 看起来非常光滑。
它允许您定义“parslets”使用JSON你确定要寻找什么,在页面上,然后将其解析什么是适合你的数据了。
正如其他人所说,可以使用一个HTML解析器构建DOM表示和使用XPath / XQuery的查询。我发现这里一个很有趣的文章:Java理论与实践:用XQuery进行屏幕搜集 - 的 http://www.ibm.com/developerworks/xml/library/j-jtp03225.html
公平足够,我要使用标记汤方法的建议。
将作为后续问题 - 如何在地球上那些大刮板式网站做呢?我已经看到,扫描数千个网站的职位搜索引擎(例如indeed.com)!那是成千上万的正则表达式的?其几乎不可能...