标签值不打印 etree lxml

Tag value not printing etree lxml

我想打印代码的“可打印字符串”部分。我还尝试自己打印整个标签,但没有找到打印整个标签而不仅仅是标签名称的方法。检索 Xpath 和整个标签本身是目前最大的挑战,谢谢!

代码:

from bs4 import BeautifulSoup
from lxml import etree

doc = "<p><a></a><a></a>Printable String</p>"
soup = BeautifulSoup(doc, "lxml")
root = etree.fromstring(str(soup))

tree = etree.ElementTree(root)
for i, e in enumerate(root.iter()):
    print(e.text)

输出:

None
None
None
None
None
[Finished in 0.2s]

预期输出:

None 
None
Printable String
None 
None

就这么简单:-

from bs4 import BeautifulSoup

doc = "<p><a></a><a></a>Printable String</p>"
soup = BeautifulSoup(doc, "lxml")
print(soup.find('p').text)

...或者如果您想要纯 etree 解决方案,则:-

from lxml import etree
from io import StringIO

doc = '<p><a></a><a></a>Printable String</p>'

tree = etree.parse(StringIO(doc))
print(tree.xpath('//p/text()')[0])

有两点需要注意:

首先,出于某种原因,您首先用 soup 解析 doc,然后再次用 lxml 解析 soup 的字符串。第一个问题是 BS 没有留下字符串。如果你

print(soup)

输出是

<html><body><p><a></a><a></a>Printable String</p></body></html>

您会注意到现在添加了两个新元素(htmlbody),这解释了为什么您得到五个 None 而不是三个。

如果你像这样直接用 lxml 解析 doc 并使用 xpath:

doc = "<p><a></a><a></a>Printable String</p>"
root = etree.fromstring(doc)
for z in root.xpath('//*'):
    print(z.xpath('text()'))

输出是

['Printable String']
[]
[]