xpath过滤元素怎么写

python新手,问题比较初级,各位大佬轻喷。
需要爬点数据,有个xpath问题请教下各位大佬,如下面html代码所示,
<span class="media-caption__text"></span>标签就获取它内部文本,没有就获取<figcaption></figcaption>内部的文本,但是必须要过滤掉<span class="off-screen"></span>

html代码如下所示:

<figcaption class="media-caption">
    <span class="off-screen">Image caption</span> 
    <span class="media-caption__text"> &#32445;&#32422;&#24066;&#26159;&#32654;&#22269;&#30123;&#24773;&#30340;&#8220;&#38663;&#20013;&#8221;&#12290;    </span>
</figcaption>

或者

<figcaption class="media-with-caption__caption">
    <span class="off-screen"></span>     
    &#22833;&#19994;&#20013;&#30340;&#32654;&#22269;&#38738;&#24180;&#65306;&#27882;&#27700;&#12289;&#24656;&#24807;&#19982;&#19981;&#23433;
</figcaption>
阅读 3.2k
2 个回答

为什么不用代码逻辑呢。。。
用xpath的话感觉很丑

//figcaption/span[@class="media-caption__text"][count(//figcaption/span[@class="media-caption__text"]) > 0]/text()[normalize-space()]|//figcaption[count(//figcaption/span[@class="media-caption__text"]) = 0]/text()[normalize-space()]
from lxml import etree
text = '''
<figcaption class="media-caption">
<span class="off-screen">Image caption</span>
<span class="media-caption__text"> &#32445;&#32422;&#24066;&#26159;&#32654;&#22269;&#30123;&#24773;&#30340;&#8220;&#38663;&#20013;&#8221;&#12290; </span>
</figcaption>
<figcaption class="media-with-caption__caption">
<span class="off-screen"></span>
&#22833;&#19994;&#20013;&#30340;&#32654;&#22269;&#38738;&#24180;&#65306;&#27882;&#27700;&#12289;&#24656;&#24807;&#19982;&#19981;&#23433;
</figcaption>
'''
html = etree.HTML(text)
result = html.xpath('//figcaption//text()[normalize-space()]')
print(result)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题