Html 使用Parsel选择器提取类名内容时绕过em标记

Html 使用Parsel选择器提取类名内容时绕过em标记,html,python-3.x,selenium-webdriver,parsel,Html,Python 3.x,Selenium Webdriver,Parsel,我试图提取类名的内容。如何提取所有内容,包括“em”标记内部和“em”标记之后的内容?见下图: 我尝试了以下方法,结果如下: 试验1: driver = webdriver.Chrome(options=options) sel = Selector(text = driver.page_source) sel.xpath("//*[@class ='st']").extract() 产出1: >> <span class="st"><span class="f

我试图提取类名的内容。如何提取所有内容,包括“em”标记内部和“em”标记之后的内容?见下图:

我尝试了以下方法,结果如下:

试验1:

driver = webdriver.Chrome(options=options)
sel = Selector(text = driver.page_source)
sel.xpath("//*[@class ='st']").extract()
产出1:

>> <span class="st"><span class="f">Nov 26, 2018 - </span>First #<em>GDPR fine</em> awarded in Germany. 330,000 user data stolen. Usernames and passwords stored in plaintext. €20,000 <em>fine</em>. Why "so low"?</span>
产出2:

>> First #
理想情况下,我希望得到的输出是:

>> Nov 26, 2018 - First #GDPR fine awarded in Germany. 330,000 user data stolen. Usernames and passwords stored in plaintext. €20,000 fine. Why "so low"?

我最终找到了一个解决问题的方法,虽然不是一个优雅的方法,但我仍然欢迎一个更优雅的解决方案

我使用以下方法提取类名的内容:

 driver = webdriver.Chrome(options=options)
 sel = Selector(text = driver.page_source)
 content = sel.xpath("//*[@class ='st']").extract()
然后我定义了一个函数,将html从文本中剥离:

import html.parser

class HTMLTextExtractor(html.parser.HTMLParser):
    def __init__(self):
        super(HTMLTextExtractor, self).__init__()
        self.result = [ ]

    def handle_data(self, d):
       self.result.append(d)

    def get_text(self):
       return ''.join(self.result)

    def html_to_text(html):
        s = HTMLTextExtractor()
        s.feed(html)
        return s.get_text()
循环浏览列表中的内容并一次剥离一个html,得到了我想要的结果:

  m = []
  for w in content:
      z = html_to_text(w)
      m.append(z)

我不知道Parsel,但您是否尝试过类似于
/*[@class='st']::text
或CSS选择器
span.st::text
?请参见@JeffC,这些表达式会抛出错误。到目前为止,我已经尝试了
sel.xpath(“string(//span[@class='st']))”)。getall()
请参阅。这适用于提取全文,但只返回第一个list元素,理想情况下,我希望返回页面中所有匹配类名的列表。
  m = []
  for w in content:
      z = html_to_text(w)
      m.append(z)