0

我正在尝试创建一个爬虫,我需要能够执行不同的查询以从爬取的页面中提取不同类型的数据。我一直在研究 CsQuery 以提取数据,当我有一个简单的 CSS 选择器时,它似乎工作得很好

h4:包含('文本字符串')

我的问题是我需要能够评估如下复杂查询:

["h4:contains('textstring')"].Parent().Parent().Find("div").Find("span").Text();

我还没有找到任何好的解决方案。CsQuery 可以轻松完成上述操作,但前提是我将其编写在代码中,并且由于我希望能够执行保存在数据库中的查询,因此我需要能够动态加载和执行查询。我目前最好的想法是让递归函数一次通过一个点的语句,但这将导致对该函数的 6 次调用才能执行上述查询。似乎我最终会创建 CsQuery 中已经存在的功能,但我想不出一种更优雅的方式来解决这些问题。

任何想法将不胜感激。

4

1 回答 1

0

有几种方法可以做到这一点。首先,您可以使用反射和正则表达式将 c# 字符串从数据库转换为表达式。有很多小项目可以做到这一点。另一种选择是托管一个脚本环境,例如 Iron python 或 jint,并使用其中一个来编写您的表达式。第三种选择是使用代码域并评估保存的字符串,然后转换为程序集。每个选项都有优点和缺点。

第一个选项使用可能非常慢的反射。但是您可以本机使用 c#。第二个选项使用另一种语言,并且需要设置脚本环境。但是对于非程序员来说,开发表达式可能更容易。第三个选项需要在每次表达式更改但无法卸载时创建一个新程序集。但是这个选项在处理速度上可能是整体上最快的。

就我个人而言,我会主持 jint 以降低网络人的学习曲线,如果您只需要正确的 CLR 和 csquery 库访问,它的环境设置将相当容易。

于 2014-04-05T12:33:05.193 回答