支持xpath的抓取框架
我正在寻找一个网页抓取框架,让我支持xpath的抓取框架,xpath,css-selectors,web-scraping,Xpath,Css Selectors,Web Scraping,我正在寻找一个网页抓取框架,让我 点击给定端点并加载html响应 通过一些css选择器搜索元素 恢复该元素的xpath 有什么建议吗?我见过很多让我通过xpath进行搜索的方法,但没有一种方法能真正为元素生成xpath。似乎没有多少人通过CSS选择器进行搜索,但希望结果是xpath,但有一些方法可以实现 首先,我使用JQuery加上一个附加函数来完成这项工作。这是因为JQuery有很好的选择,并且很容易找到对的支持。您可以,因此您应该能够在该域(在服务器上)而不是在客户端(如我的简单示例所示)实
有什么建议吗?我见过很多让我通过xpath进行搜索的方法,但没有一种方法能真正为元素生成xpath。似乎没有多少人通过CSS选择器进行搜索,但希望结果是xpath,但有一些方法可以实现 首先,我使用JQuery加上一个附加函数来完成这项工作。这是因为JQuery有很好的选择,并且很容易找到对的支持。您可以,因此您应该能够在该域(在服务器上)而不是在客户端(如我的简单示例所示)实现我的代码。如果这不是一个选项,您可以在下面查找我的另一个使用Python的潜在解决方案,或者在底部查找C#starter
对于JQuery方法,纯JavaScript函数对于返回XPath非常简单。在下面的示例()中,我使用JQuery选择器检索示例锚元素,获取剥离的DOM元素,并将其发送到我的
getXPath
函数:
<html>
<head>
<title>The jQuery Example</title>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
function getXPath( element )
{
var xpath = '';
for ( ; element && element.nodeType == 1; element = element.parentNode )
{
var id = $(element.parentNode).children(element.tagName).index(element) + 1;
id > 1 ? (id = '[' + id + ']') : (id = '');
xpath = '/' + element.tagName.toLowerCase() + id + xpath;
}
return xpath;
}
$(document).ready(function() {
$("#example").click(function() {
alert("Link Xpath: " + getXPath($("#example")[0]));
});
});
</script>
</head>
<body>
<p id="p1">This is an example paragraph.</p>
<p id="p2">This is an example paragraph with a <a id="example" href="#">link inside.</a></p>
</body>
</html>
要使用选择器,只需使用文档或元素对象调用它:
CSSSelector接受一个转换器参数,让您选择
翻译使用。它可以是“xml”(默认值)、“xhtml”、“html”或
翻译对象
如果要从url加载,可以在构建etree时直接加载:root=etree.fromstring(xml,base\u url=)http://where.it/is/from.xml“”
C# 有一个名为的库,它只进行CSS到XPath的转换
String css = "div#test .note span:first-child";
String xpath = css2xpath.Transform(css);
// 'xpath' will contain:
// //div[@id='test']//*[contains(concat(' ',normalize-space(@class),' '),' note ')]*[1]/self::span
当然,使用C#实用程序类从url获取字符串非常容易,不需要太多讨论:
using(WebClient client = new WebClient()) {
string s = client.DownloadString(url);
}
至于CSS选择器的选择,你可以试试,这是非常强大的。以下是头版示例,但您可以做更多:
// Load the document using HTMLAgilityPack as normal
var html = new HtmlDocument();
html.LoadHtml(@"
<html>
<head></head>
<body>
<div>
<p class='content'>Fizzler</p>
<p>CSS Selector Engine</p></div>
</body>
</html>");
// Fizzler for HtmlAgilityPack is implemented as the
// QuerySelectorAll extension method on HtmlNode
var document = html.DocumentNode;
// yields: [<p class="content">Fizzler</p>]
document.QuerySelectorAll(".content");
// yields: [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("p");
// yields empty sequence
document.QuerySelectorAll("body>p");
// yields [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("body p");
// yields [<p class="content">Fizzler</p>]
document.QuerySelectorAll("p:first-child");
//正常使用HTMLAgilityPack加载文档
var html=新的HtmlDocument();
html.LoadHtml(@)
流苏
CSS选择器引擎
");
//HtmlAgilityPack的Fizzler实现为
//HtmlNode上的QuerySelectorAll扩展方法
var document=html.DocumentNode;
//收益率:[p class=“content”>Fizzler]
document.QuerySelectorAll(“.content”);
//收益率:[p class=“content”>Fizzler,CSS选择引擎
文件。查询选择器所有(“p”);
//产生空序列
document.queryselectoral(“body>p”);
//产生[Fizzler
,CSS选择器引擎
文件。查询选择器所有(“正文p”);
//收益率[Fizzler
]
文件。查询选择器(p:第一个孩子);
如果有的话,您只能使用哪种语言?任何语言都可以。您有机会看看我发布的答案吗?JQuery示例很简单,但需要在Node.js中实现,除了我链接到的材料(其中解释了在该域中使用JQuery的一些内容)之外,我无法进一步帮助Node.js。Python示例已经完成,但从技术上讲并不是一个web抓取框架。C#示例实际上来自HTMLAgilityPack,它是一个完整的web抓取框架;答案比我预期的要详细得多(质量也更高)。
>>> from cssselect import GenericTranslator
>>> from lxml.etree import XPath
>>> sel = XPath(GenericTranslator().css_to_xpath('div.content'))
String css = "div#test .note span:first-child";
String xpath = css2xpath.Transform(css);
// 'xpath' will contain:
// //div[@id='test']//*[contains(concat(' ',normalize-space(@class),' '),' note ')]*[1]/self::span
using(WebClient client = new WebClient()) {
string s = client.DownloadString(url);
}
// Load the document using HTMLAgilityPack as normal
var html = new HtmlDocument();
html.LoadHtml(@"
<html>
<head></head>
<body>
<div>
<p class='content'>Fizzler</p>
<p>CSS Selector Engine</p></div>
</body>
</html>");
// Fizzler for HtmlAgilityPack is implemented as the
// QuerySelectorAll extension method on HtmlNode
var document = html.DocumentNode;
// yields: [<p class="content">Fizzler</p>]
document.QuerySelectorAll(".content");
// yields: [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("p");
// yields empty sequence
document.QuerySelectorAll("body>p");
// yields [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("body p");
// yields [<p class="content">Fizzler</p>]
document.QuerySelectorAll("p:first-child");