xpath,用于在一个字符串中获取标记下的所有内容

xpath,用于在一个字符串中获取标记下的所有内容,xpath,Xpath,我想用Python编写一个XPath,以获得li标记的全部内容,包括a标记的内容 <li> Lake 2014: 9th Biennial Lake Symposium on " <a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a> ", 13-15th N

我想用Python编写一个XPath,以获得
li
标记的全部内容,包括
a
标记的内容

<li>
Lake 2014: 9th Biennial Lake Symposium on "
<a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
", 13-15th November 2014
</li>
这将输出3个不同的字符串:

Lake 2014:第九届两年一度的湖泊研讨会
西高止山脉湿地生态系统的保护
“,2014年11月13日至15日。

如何将它们作为单个字符串获取?

最好的选择似乎是简单地使用
string()
实现您想要实现的目标。它还从XML中删除注释。它将整个元素转换为xs:string:

//div[@class='inner_body_left']/ul/li/string()
如果由于某些与业务逻辑相关的原因,此操作不起作用,则始终可以连接字符串:

concat(//div[@class='inner_body_left']/ul/li//text())

Python shell会话示例:

>>> import lxml.html
>>> doc = lxml.html.fromstring("""<div class="inner_body_left">
... <ul>
... <li>
... Lake 2014: 9th Biennial Lake Symposium on "
... <a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
... ", 13-15th November 2014
... </li>
... </ul>
... </div>""")
获取所有文本元素:

>>> doc.xpath("//div[@class='inner_body_left']/ul/li//text()") 
['\nLake 2014: 9th Biennial Lake Symposium on "\n', 'Conservation of Wetland Ecosystems in Western Ghats', '\n", 13-15th November 2014\n']
>>> doc.xpath("//div[@class='inner_body_left']/ul/li/descendant-or-self::*/text()") 
['\nLake 2014: 9th Biennial Lake Symposium on "\n', 'Conservation of Wetland Ecosystems in Western Ghats', '\n", 13-15th November 2014\n']
排除
a
元素中的文本(使用
/genderant或self::*[非(self::a)]/
而不是
/

>>> doc.xpath("//div[@class='inner_body_left']/ul/li/descendant-or-self::*[not(self::a)]/text()") 
['\nLake 2014: 9th Biennial Lake Symposium on "\n', '\n", 13-15th November 2014\n']
>>> "".join(doc.xpath("//div[@class='inner_body_left']/ul/li/descendant-or-self::*[not(self::a)]/text()") )
'\nLake 2014: 9th Biennial Lake Symposium on "\n\n", 13-15th November 2014\n'
>>> 

更新了示例,其中有多个元素可供选择:

>>> doc = """<div class="inner_body_left">
... <ul>
... <li>
... Lake 2014: 9th Biennial Lake Symposium on "
... <a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
... ", 13-15th November 2014
... </li>
... <li>
... Lake 2015: 10th Biennial Lake Symposium on "
... <a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
... ", 13-15th November 2015
... </li>
... </ul>
... </div>"""
>>> root = lxml.html.fromstring(doc)
>>>
>>> import pprint
>>> pprint.pprint([element.xpath("string(.)")
...                for element in root.xpath("//div[@class='inner_body_left']/ul/li")])
['\nLake 2014: 9th Biennial Lake Symposium on "\nConservation of Wetland Ecosystems in Western Ghats\n", 13-15th November 2014\n',
 '\nLake 2015: 10th Biennial Lake Symposium on "\nConservation of Wetland Ecosystems in Western Ghats\n", 13-15th November 2015\n']
>>> pprint.pprint(["".join(element.xpath("./descendant-or-self::*[not(self::a)]/text()"))
...                for element in root.xpath("//div[@class='inner_body_left']/ul/li")]
... )
['\nLake 2014: 9th Biennial Lake Symposium on "\n\n", 13-15th November 2014\n',
 '\nLake 2015: 10th Biennial Lake Symposium on "\n\n", 13-15th November 2015\n']
>>> 
>>doc=”“”
…
  • ……2014年湖泊:第九届两年一度的“湖泊研讨会” ... ……”,2014年11月13日至15日
  • ……2015年湖泊:第十届两年一度的“湖泊研讨会” ... ……”,2015年11月13日至15日
... """ >>>root=lxml.html.fromstring(doc) >>> >>>导入pprint >>>pprint.pprint([element.xpath(“字符串()”)) …对于root.xpath中的元素(“//div[@class='inner\u body\u left']/ul/li”)) ['\n 2014年12月13日至15日:第九届两年一度的湖泊研讨会,主题为“\n高塔西部湿地生态系统的保护”,2014年11月13日至15日, “\n 2015年12月13日至15日:第十届两年一度的湖泊研讨会,主题为“\n高塔西部湿地生态系统的保护”\n” >>>pprint.pprint([“”.join(element.xpath(“./后代或self::*[not(self::a)]/text()”) …对于root.xpath中的元素(“//div[@class='inner\u body\u left']/ul/li”)] ... ) ['\n 2014年12月13日至15日:第九届“湖泊”双年展, “\n 2015年12月13日至15日,第十届两年一度的湖泊研讨会”\n\n] >>>
请参见

我用过

concat(substring(//div/ul/li/text()[1],1,string-length(//div/ul/li/text()[1])-1),//div/ul/li/a/text(),substring(//div/ul/li/text()[2],2))
为了

<?xml version="1.0" encoding="UTF-8"?><div>
  <ul>
<li>
Lake 2014: 9th Biennial Lake Symposium on "
<a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
", 13-15th November 2014
</li>
  </ul>
</div>

  • 2014年湖泊:第九届“双年展”湖泊研讨会 “,2014年11月13日至15日

为了得到一行,我们必须在使用子字符串函数之前删除换行符,在使用子字符串

函数之后删除一行换行符。另外一个问题:您如何忽略
a
的文本,而忽略所有其他文本节点?为了避免“a”内容,您可以将xpath编写为//div[@class='inner\u body\u left']/ul/li/text()“不工作”不是错误描述-什么不起作用?如果您有其他限制或更多细节,请编辑您的问题。@user3446000:如果
a
有其他同级元素,则不是。我想需要一个额外的模板,如
ul/li[not(a)]如果
li
后面有
a
元素,则
将排除整个节点集。顺便说一句,您没有发布任何python代码,可能与查看整个设置有关。@dirkk,您的意思是
字符串(//div[@class='inner\u body\u left']/ul li)
?实际上,我希望div标记下有许多节点。div标记的所有节点都具有类似的结构。因此,在本例中,string()不起作用。其他选项给出了3个不同的字符串。我希望它作为一个字符串。请看最后一个示例,使用
“”.join()
。此外,您可以始终使用
元素.xpath(“string(.))对于doc.xpath中的元素(“//div[@class='internal\u body\u left']]/ul/li”)
@user3446000,我用
div
元素下的多个匹配的示例更新了我的答案更新后的答案有效!但它会插入不必要的空间。我使用:title=filter(lambda name:name.strip(),title)来避免此类空格。但是,我仍然看到这里和那里很少有空格。还有什么我能做的吗?你可以试试
element.xpath(“normalizespace(.)”)
我刚刚否决了你的问题,因为你在每个新评论中都给出了一些信息。请用所有必要的信息编辑一个更有价值的问题,以便正确回答!如果你问一个问题,并期待一个有用的答案,你也应该给所有的信息,否则我严重地认为这是浪费我的时间。
concat(substring(//div/ul/li/text()[1],1,string-length(//div/ul/li/text()[1])-1),//div/ul/li/a/text(),substring(//div/ul/li/text()[2],2))
<?xml version="1.0" encoding="UTF-8"?><div>
  <ul>
<li>
Lake 2014: 9th Biennial Lake Symposium on "
<a target="_blank" href="/events/CES_TVR_LAKE_2014_brochure_2FEb2014.pdf">Conservation of Wetland Ecosystems in Western Ghats</a>
", 13-15th November 2014
</li>
  </ul>
</div>