支持xpath的抓取框架

支持xpath的抓取框架,xpath,css-selectors,web-scraping,Xpath,Css Selectors,Web Scraping,我正在寻找一个网页抓取框架,让我 点击给定端点并加载html响应 通过一些css选择器搜索元素 恢复该元素的xpath 有什么建议吗?我见过很多让我通过xpath进行搜索的方法,但没有一种方法能真正为元素生成xpath。似乎没有多少人通过CSS选择器进行搜索,但希望结果是xpath,但有一些方法可以实现 首先,我使用JQuery加上一个附加函数来完成这项工作。这是因为JQuery有很好的选择,并且很容易找到对的支持。您可以,因此您应该能够在该域(在服务器上)而不是在客户端(如我的简单示例所示)实

我正在寻找一个网页抓取框架,让我

  • 点击给定端点并加载html响应
  • 通过一些css选择器搜索元素
  • 恢复该元素的xpath

  • 有什么建议吗?我见过很多让我通过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");