在这个SOAP XML文件中,如何7使用XPath查询?
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>7</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
此XPath查询无效//*[name () ='soap:Body'].
我是新手,我正在玩scrapy shell尝试抓取这个网站:www.spiegel.de/sitemap.xml
我做到了
scrapy shell "http://www.spiegel.de/sitemap.xml"
Run Code Online (Sandbox Code Playgroud)
当我使用时,它工作得很好
response.body
Run Code Online (Sandbox Code Playgroud)
我可以看到整个页面包括xml标签
但是例如:
response.xpath('//loc')
Run Code Online (Sandbox Code Playgroud)
根本不会工作.
我得到的结果是一个空数组
而
response.selector.re('somevalidregexpexpression')
Run Code Online (Sandbox Code Playgroud)
会工作
任何想法可能是什么原因?可能与编码有关吗?该网站不是utf-8
我在Win 7上使用python 2.7.我在另一个站点(dmoz)上尝试了xpath(),它工作正常.
我正在努力获得XPath表达式和命名空间规范的正确组合,这是package XML(argument namespaces)对于xmlns在顶部元素中定义了显式命名空间的XML文档所要求的.
感谢har07,我能够把它放在一起:
一旦查询名称空间,第一个条目ns还没有名称,这就是问题所在:
nsDefs <- xmlNamespaceDefinitions(doc)
ns <- structure(sapply(nsDefs, function(x) x$uri), names = names(nsDefs))
> ns
omegahat r
"http://something.org" "http://www.omegahat.org" "http://www.r-project.org"
Run Code Online (Sandbox Code Playgroud)
所以我们只需指定一个充当前缀的名称(这可以是任何有效的R名称):
names(ns)[1] <- "xmlns"
Run Code Online (Sandbox Code Playgroud)
现在,我们所要做的就是在XPath表达式中的任何地方使用默认名称空间前缀:
getNodeSet(doc, "/xmlns:doc//xmlns:b[@omegahat:status='foo']", ns)
Run Code Online (Sandbox Code Playgroud)
对于那些对基于name()和namespace-uri()(以及其他)的替代解决方案感兴趣的人可能会发现此帖有用.
仅仅是为了参考:在我们找到解决方案之前,这是试错代码:
考虑以下示例?xmlParse:
require("XML")
doc <- xmlParse(system.file("exampleData", "tagnames.xml", package = "XML"))
> doc
<?xml version="1.0"?>
<doc>
<!-- A comment -->
<a xmlns:omegahat="http://www.omegahat.org" xmlns:r="http://www.r-project.org">
<b>
<c>
<b/>
</c> …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的xml字符串
str1 = """<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>
http://www.example.org/sitemap_1.xml.gz
</loc>
<lastmod>2015-07-01</lastmod>
</sitemap>
</sitemapindex> """
Run Code Online (Sandbox Code Playgroud)
我想提取<loc>节点内存在的所有网址,即http://www.example.org/sitemap_1.xml.gz
我尝试了这段代码,但没有说出来
from lxml import etree
root = etree.fromstring(str1)
urls = root.xpath("//loc/text()")
print urls
[]
Run Code Online (Sandbox Code Playgroud)
我试图检查我的根节点是否正确形成.我尝试了这个并获得与str1相同的字符串
etree.tostring(root)
'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n<sitemap>\n<loc>http://www.example.org/sitemap_1.xml.gz</loc>\n<lastmod>2015-07-01</lastmod>\n</sitemap>\n</sitemapindex>'
Run Code Online (Sandbox Code Playgroud)