Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Xpath提取当前节点内容,包括所有子节点_Python_Xpath_Lxml - Fatal编程技术网

Python Xpath提取当前节点内容,包括所有子节点

Python Xpath提取当前节点内容,包括所有子节点,python,xpath,lxml,Python,Xpath,Lxml,提取当前节点内容(包括所有子节点)时遇到问题 就像下面的代码一样,我想得到字符串 abcdefgb1b2b3 在预标记中 但是我不能用“child::*”来获取它。 如果使用“/text()”,则会丢失b标记格式信息。请帮帮我 # -*- coding: utf-8 -*- from lxml import html import lxml.etree as le input = "<pre>abcdefg<b>b1b2b3</b></pre>"

提取当前节点内容(包括所有子节点)时遇到问题

就像下面的代码一样,我想得到字符串
abcdefgb1b2b3
在预标记中

但是我不能用“child::*”来获取它。 如果使用“/text()”,则会丢失b标记格式信息。请帮帮我

# -*- coding: utf-8 -*-
from lxml import html
import lxml.etree as le

input = "<pre>abcdefg<b>b1b2b3</b></pre>"
input_xpath = "//pre/child::*"
tree = html.fromstring(input)
result = tree.xpath(input_xpath)
result1 = [le.tostring(item) for item in result]
result2 = ''.join(result1)
print result2

output: <b>b1b2b3</b>
#-*-编码:utf-8-*-
从lxml导入html
将lxml.etree作为le导入
输入=“abcdefgb1b2b3”
input_xpath=“//pre/child::*”
tree=html.fromstring(输入)
结果=tree.xpath(输入\ xpath)
结果1=[结果中项目的le.tostring(项目)]
结果2=''.join(结果1)
打印结果2
输出:b1b2b3

尝试用以下内容替换xpath

from lxml import html
import lxml.etree as le

input = "<pre>abcdefg<b>b1b2b3</b></pre>"
tree = html.fromstring(input)
node = tree.xpath("//pre")[0]
[0]中的
:input=“abcdefgb1b2b3”
result = node.text + ''.join(le.tostring(e) for e in node)
print result
在[1]中:输入_xpath=“//pre//text()” 在[2]中:tree=html.fromstring(输入) 在[3]中:result=tree.xpath(input_xpath) 在[4]中:结果 Out[5]:['abcdefg','b1b2b3']
要获取XML节点的内容标记(有时称为),可以从选择节点开始(而不是选择子节点或文本内容):

输出:

abcdefgb1b2b3

这对我来说很难。我不知道如何用lxml解决您的问题。@TonyYang供您参考,请检查下面的答案和链接的问题,寻找可能的解决方法。实际上,这不是我想要的。因为b1b2b3丢失了标签信息,我认为这不是一个好答案。如果输入是字符串的“b1b2b3abcdefg”,你会怎么做?你会使用
result=''.join(le.tostring(e)表示节点中的e)+node.text来回答我吗?@TonyYang令人惊讶的是,代码几乎也适用于这种情况。这种情况下唯一的问题是
节点。Text
返回
None
,因此它不能与字符串组合。添加
None
检查为我生成预期结果:
node.text如果node.text其他“”+“”.join(le.tostring(e)表示节点中的e)
result = node.text + ''.join(le.tostring(e) for e in node)
print result
abcdefg<b>b1b2b3</b>