我有一个xml文件,如下所示:
<page>
<title>title1</title>
<subtitle>subtitle</subtitle>
<ns>0</ns>
<id>1</id>
<text>hello world!@</text>
</page>
<page>
<title>title2</title>
<ns>0</ns>
<id>1</id>
<text>hello world</text>
</page>
如何获取每个页面的文字?现在我有一个每页的列表。以下代码将打印第二个页面元素的文本,但不打印第一个元素的文本。有没有办法按标记名称element['text']
for i in pages:
print i[3]
答案 0 :(得分:6)
您可以编写如下代码:
from lxml import html
xml = """<page>
<title>title1</title>
<subtitle>subtitle</subtitle>
<ns>0</ns>
<id>1</id>
<text>hello world!@</text>
</page>
<page>
<title>title2</title>
<ns>0</ns>
<id>1</id>
<text>hello world</text>
</page>"""
root = html.fromstring(xml)
print(root.xpath('//page/text/text()'))
结果将是:
['hello world!@', 'hello world']
答案 1 :(得分:1)
This tutorial帮助我完成了类似的任务:
每次迭代都会找到一个名为&#39; id&#39;或者&#39; text&#39;。如果未找到任何标记,请返回字符串,&#39;无&#39;。然后,一次迭代的结果将附加到列表中,允许我们以类似于数据框的格式打印该列表。
import lxml
import lxml.etree as ET
# Initialise a list to append results to
list_of_results = []
# Loop through the pages to search for text
for page in root:
id = page.findtext('id', default = 'None')
text = page.findtext('text', default = 'None')
list_of_results.append([id, text])
# Print list
list_of_results
结果:
[['1', 'hello world!@'], ['1', 'hello world']]
如果你想要的只是打印文本,你只需删除id行。
答案 2 :(得分:0)
为简化问题,我使用了一个“节点”帮助程序类,该类将返回一个字典:
class Node():
@staticmethod
def childTexts(node):
texts={}
for child in list(node):
texts[child.tag]=child.text
return texts
用法示例:
xml = """<pages>
<page>
<title>title1</title>
<subtitle>subtitle</subtitle>
<ns>0</ns>
<id>1</id>
<text>hello world!@</text>
</page>
<page>
<title>title2</title>
<ns>0</ns>
<id>1</id>
<text>hello world</text>
</page>
</pages>
"""
root = etree.fromstring(xml)
for node in root.xpath('//page'):
texts=Node.childTexts(node)
print (texts)
结果:
{'title': 'title1', 'subtitle': 'subtitle', 'ns': '0', 'id': '1', 'text': 'hello world!@'}
{'title': 'title2', 'ns': '0', 'id': '1', 'text': 'hello world'}
答案 3 :(得分:0)
我知道这篇文章有点老了,但这是解决我这个问题的代码。
遍历页面并使用每个页面的几个子元素来做事。
在事后看来,使用相对xpath似乎很明显,但是我认为JQuery等使我期望可以使用更多类似“对象”的对象。
var rng = ss.getRange("C2:"+"c"+lr).getDisplayValues()