lxml库提取HTML标签文本异常:子标签后文本无法获取的解决方法
解决lxml提取子标签后文本内容的问题
你遇到的核心问题是:当<p>标签内部存在子标签<i>时,元素的.text属性仅能返回该元素第一个子节点之前的文本内容(这里就是<i>标签前的空白),而目标文本WANTED TEXT属于子标签<i>的后续内容,所以直接调用.text会返回空。下面是几种可行的解决方法:
方法1:用XPath的string()函数提取全部文本
直接通过XPath的string()函数获取<p>标签下的所有文本内容,再清理多余空白:
from lxml import etree from io import StringIO html_parser = etree.HTMLParser() # 使用string()直接获取p标签下的所有文本 tmp_xp = "string(//p[1])" text_content = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp) # 清理首尾空白和多余换行 clean_text = text_content.strip() print(clean_text) # 输出: WANTED TEXT
方法2:获取子标签的tail属性
目标文本是<i>标签的后续内容,可以直接提取该子标签的tail属性:
from lxml import etree from io import StringIO html_parser = etree.HTMLParser() tmp_xp = "//p[1]/i" selected_i = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp) clean_text = selected_i[0].tail.strip() print(clean_text) # 输出: WANTED TEXT
方法3:用itertext()遍历所有文本节点
如果<p>标签内有多个子元素,itertext()会遍历所有文本内容,拼接后再清理:
from lxml import etree from io import StringIO html_parser = etree.HTMLParser() tmp_xp = "//p[1]" selected_tag = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp) # 遍历所有文本片段并拼接,再清理格式 clean_text = ''.join(selected_tag[0].itertext()).strip() print(clean_text) # 输出: WANTED TEXT
内容的提问来源于stack exchange,提问作者Minions
相关产品推荐
相关产品推荐

