Как извлечь текст в двойных кавычках внутри div с помощью XPath

avatar
Douglas Casavechia
1 июля 2021 в 15:48
207
2
2

(Извините, я часто только что Stack Overflow em Português, но на этот раз мне не помогли, и мой английский не так хорош. Но дайте мне попробовать :)

Я хочу извлечь текст, который в основном соответствует времени футбольного матча, но я не могу найти его с помощью XPath. И, честно говоря, HTML сайта не очень помогает.

Этот HTML-код:

<div class="style_title__3UbkX"> 
    "name_team_home"
    "0"
    <span>x</span>
    "2"
    "name_team_away"
</div>

Если это команды "Барселона" и "Реал Мадрид", в HTML-коде это выглядит следующим образом:

<div class="style_title__3UbkX">
    "Real Madrid"
    "0"
    <span>x</span>
    "2"
    "Barcelona"
</div>

А на сайте появится в центре сайта что-то типа

Реал Мадрид 0 x 2 Барселона

(я пока не могу отправлять изображения)

Но оно может быть разным в разные минуты игры, но это не имеет значения, поэтому, если команда «Реал Мадрид» забьет гол, число в кавычках изменится на 1.

Этот HTML для меня такой странный, потому что он не разделен. Вот так, это реальная копия с сайта. Я не привык использовать HTML, поэтому не знаю, нормально ли это.

Я хочу извлечь числа в кавычках, 0 и 2 для переменной, но мой код не находит эту информацию. Я пытаюсь использовать методы XPath, как в этом коде, но оба не могут найти информацию:

goals_h = driver.find_element_by_xpath(
    '//*[@id="root"]/div/section/section/main/div/div/div[2]/div/div/div[2]/text()[2]').text

or

goals_h = wait.until(EC.visibility_of_element_located((By.XPATH,  
    '//*[@id="root"]/div/section/section/main/div/div/div[2]/div/div/div[2]/text()[2]'))).text

Мне нужно значение в text()[2] в этом XPath.

Кто-нибудь знает, как решить эту проблему?

Заранее спасибо.

Источник
James Oltmans
1 июля 2021 в 15:56
0

Если вы можете настроить таргетинг на элемент и получить весь текст, вы можете просто использовать синтаксический анализ строки для извлечения тех битов, которые вам нужны. Я думаю, вам придется использовать комбинацию синтаксического анализа строк и xpath, чтобы получить то, что вы хотите, так, как вы этого хотите.

Abhishek
1 июля 2021 в 16:16
2

Можете ли вы поделиться URL?

Douglas Casavechia
1 июля 2021 в 16:24
0

Ок, хорошая идея, попробую

Douglas Casavechia
1 июля 2021 в 16:25
1

Я не могу поделиться URL-адресом, потому что это платный сайт с логином и паролем, чтобы иметь доступ к этой статистике :(

greybeard
1 июля 2021 в 20:48
0

This HTML for me is so strange because it's not separated как <home name='Real' score='0' /> <away name='Barça' score='2' />? Почему-то XHTML еще не стал популярным. Я не могу с уверенностью разобрать a text that is variable conform the time of the soccer game basically - можете ли вы получить помощь, если из машинного перевода?

Douglas Casavechia
2 июля 2021 в 22:07
0

я согласен с вами, я не очень разбираюсь в html, но этот сайт так странно ищет чужие сайты из-за него, я не знаю как, но статистика меняется каждую минуту, если счет изменился, даже будучи текстом в кавычках . Я сделал что-то с помощью Excel, но это неправильная форма, я все еще хочу что-то сделать с python

Ответы (2)

avatar
LMC
2 июля 2021 в 00:43
0

Этот XPath вернет 2:
"substring-after(substring-before(normalize-space(//*[@id='root']/descendant::div[span[.='x']]/text()[2]),'\" \"'),'\"')"

Общая форма:

substring-after(
  substring-before(
    normalize-space(haystack),
  needle-before),
needle-after)

Проверено на этом фрагменте html

<div id="root">
<section>
    <div>
            <div class="style_title__3UbkX">
                "name_team_home"
                "0"
                <span>x</span>
                "2"
                "name_team_away"
            </div>
    </div>
</section>
</div>

С lxml:

>>> from lxml import html
>>> tree = html.parse(r'/home/lmc/tmp/test.html')
>>> result = tree.xpath("substring-after(substring-before(normalize-space(//*[@id='root']/descendant::div[span[.='x']]/text()[2]),'\" \"'),'\"')")
>>> result
'2'

Другой XPath:
"substring-before(substring-after(normalize-space(//*[@id='root']/descendant::div[span[.='x']]/text()[1]),'\" \"'),'\"')"

Результат:
0
Общая форма:

substring-before(
  substring-after(
    normalize-space(haystack),
  needle-after),
needle-before)

Ключом является этот XPath
"normalize-space(//*[@id='root']/descendant::div[span[.='x']]/text()[2])"
который возвращает
"2" "name_team_away"
тогда подстрока для «вырезания» строки будет
" "

Douglas Casavechia
2 июля 2021 в 21:52
0

спасибо, LMC, я пытаюсь сделать это на этих выходных, а потом вернусь, чтобы рассказать вам, что получилось. Я уже что-то делал, но использовал формы excel и vba, а не python. Excel помог мне на данный момент, но это не правильный путь.

LMC
2 июля 2021 в 22:00
0

Xpath должен работать практически в любом приложении/языке, надеюсь, он сработает для вас. В случае возникновения проблем начните с использования xpath внутри normalize-space(), а затем добавьте остальные.

avatar
Forensic_07
2 июля 2021 в 00:08
0

Чтобы получить хорошее решение, я бы сделал то, что предлагает выше Джеймс Олтманс.

Для ПЛОХОГО решения:

normalize-space(substring-after(substring-after(//div[@class="style_title__3UbkX"]/text()[1], "\n"),"\n"))

и

normalize-space(substring-before(substring-after(//div[@class="style_title__3UbkX"]/text()[2], "\n"), "\n"))

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

Douglas Casavechia
2 июля 2021 в 21:58
0

я сделал что-то с формами excel и кодом vba, это неправильный способ, но он работает, так что в данный момент все было в порядке, но я пытаюсь сделать то, что сказали ребята выше