Обходить em-теги при извлечении содержимого имени класса с помощью селектора синтаксического анализа

#html #python-3.x #selenium-webdriver #parsel

#HTML #python-3.x #selenium-webdriver #синтаксический анализ

Вопрос:

Я пытаюсь извлечь содержимое имени класса. Как мне извлечь все содержимое, включая содержимое внутри тегов ’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:

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

Вывод 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"?
  

Комментарии:

1. Я не знаю Parsel, но вы пробовали что-то вроде //*[@class='st']::text или CSS-селектора span.st::text ? Смотрите документы

2. @JeffC Эти выражения выдают ошибки. До сих пор я пытался sel.xpath("string(//span[@class = 'st'])").getall() посмотреть ссылку . Это работает для извлечения полного текста, но возвращает только первый элемент списка, где в идеале я бы хотел, чтобы возвращался список всех совпадающих имен классов на странице.

Ответ №1:

В конце концов я нашел способ решить проблему, хотя и не элегантный, но все же приветствовал бы более элегантное решение.

Я извлек содержимое имени класса с помощью:

  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)