如何从XPath查询中的先前属性值中提取嵌入的属性值?

时间:2011-07-02 01:14:33

标签: python html xpath scrapy scraper

我正在尝试从html的以下部分中的onclick属性“选择”链接

<span onclick="Javascript:document.quickFindForm.action='/blah_blah'" 
 class="specialLinkType"><img src="blah"></span>

但不能比以下XPath更进一步

//span[@class="specialLinkType"]/@onclick

只返回

Javascript:document.quickFindForm.action

有关如何使用XPath选择quickFindForm.action内部链接的任何想法吗?

3 个答案:

答案 0 :(得分:1)

我在Java应用程序中尝试了XPath,它运行正常:

    import java.io.IOException;
    import java.io.StringReader;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathFactory;

    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;

    public class Teste {

        public static void main(String[] args) throws Exception {
            Document doc = stringToDom("<span onclick=\"Javascript:document.quickFindForm.action='/blah_blah'\" class=\"specialLinkType\"><img src=\"blah\"/></span>");
            XPath newXPath = XPathFactory.newInstance().newXPath();
            XPathExpression xpathExpr = newXPath.compile("//span[@class=\"specialLinkType\"]/@onclick");
            String result = xpathExpr.evaluate(doc);
            System.out.println(result);

        }

        public static Document stringToDom(String xmlSource) throws SAXException, ParserConfigurationException, IOException {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            return builder.parse(new InputSource(new StringReader(xmlSource)));
        }
    }

结果:

Javascript:document.quickFindForm.action='/blah_blah'

答案 1 :(得分:0)

如果Scrapy支持XPath字符串函数,则可以使用

substring-before(
   substring-after(
      //span[@class="specialLinkType"]/@onclick,"quickFindForm.action='")
   ,"'")

看起来它也支持正则表达式。这样的事情应该有效

.select('//span[@class="specialLinkType"]/@onclick').re(r'quickFindForm.action=\'(.*?)\'')

警告:我无法测试第二个解决方案,在这种情况下,您必须检查\'是单引号的正确转义序列。

答案 2 :(得分:0)

我使用了xquery但它在xpath中应该是相同的。我使用了一个xpath函数“tokenize”,它根据正则表达式(http://www.xqueryfunctions.com/xq/fn_tokenize.html)拆分字符串。 在这种情况下,我根据“'”

拆分字符串
        xquery version "1.0";
        let $x := //span[@class="specialLinkType"]/@onclick
        let $c := fn:tokenize( $x, '''' )
        return $c[2]

在xpath中应该是:

        fn:tokenize(//span[@class="specialLinkType"]/@onclick, '''' )[2]