When I use lxml.etree to parse HTML, if the target tag contains multiple tags, I cannot parse all the text using XPath. For example:
content = """
<h3 id="author">
<span>
<a target="_blank">zhang</a>
</span>
<span>
<a target="_blank">wang</a>
</span>
<p class="email">1234567@qq.com</p>
<span>
<a target="_blank">li</a>
</span>
<span>
<a target="_blank">lin</a>
</span>
</h3>
"""
from lxml import etree
html_tree = etree.HTML(content)
print(html_tree.xpath('//h3[@id="author"]//text()'))
The result is:
['\n ',
'\n ',
'zhang',
'\n ',
'\n ',
'\n ',
'wang',
'\n ',
'\n ']
I can't get the text "Li" and "Lin", But when I delete the P tag, I can get all the text. For example:
content = """
<h3 id="author">
<span>
<a target="_blank">zhang</a>
</span>
<span>
<a target="_blank">wang</a>
</span>
<span>
<a target="_blank">li</a>
</span>
<span>
<a target="_blank">lin</a>
</span>
</h3>
"""
from lxml import etree
html_tree = etree.HTML(content)
print(html_tree.xpath('//h3[@id="author"]//text()'))
The result is:
['\n ',
'\n ',
'zhang',
'\n ',
'\n ',
'\n ',
'wang',
'\n ',
'\n ',
'\n ',
'li',
'\n ',
'\n ',
'\n ',
'lin',
'\n ',
'\n ']
- python3.6.2
- lxml (3.8.0)