Выражение не верно - PullRequest
       9

Выражение не верно

1 голос
/ 20 сентября 2019

Я пытаюсь извлечь страну (здесь Индонезия) из следующей фразы:

<small class="text-muted">
                            <span class="hidden-xs">Football / </span>Indonesia / 
                            <span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30                            </small>

В настоящее время я просто использую следующую команду для извлечения текста:

.xpath('.//small[@class="text-muted"]/text()').extract()

Какова правильная команда регулярных выражений для извлечения только Индонезии?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Вы можете использовать это выражение XPath-1.0:

//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()

с результатом Indonesia /.
Если вы хотите избавиться от косой черты, у вас есть несколько возможностей:

  1. Удалите все косые черты из выражения:

    normalize-space(translate(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/",""))
    
  2. Используйте substring-before(), чтобы получить строку перед косой чертой:

    normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text(),"/"))
    
  3. Используйте substring-before(), чтобы получить строку перед первым пробелом:

    normalize-space(substring-before(//small[@class="text-muted"]/span[@class="hidden-xs"]/following-sibling::text()," "))
    

Существуют и другие выражения XPath, которые также будут работать.Выберите тот, который лучше всего подходит в вашей ситуации.Начальная точка перед // необходима только в том случае, если вы указали относительный путь к текущему узлу.В вышеприведенных выражениях я предполагал, что поиск является глобальным.

И, конечно, эти выражения XPath должны быть окружены

.xpath('...').extract()
0 голосов
/ 20 сентября 2019

Вопрос в том, сколько вы знаете о входе?Вы, очевидно, не знаете, что он содержит «Индонезия», но все ли остальные части ввода полностью исправлены?Например, всегда ли текст, который вы ищете, следует сразу за элементом span с содержимым Football /?

Если это так, вы можете сделать

//small[@class="text-muted"]/span[. = Football / ']/following-sibling::text()[1]
0 голосов
/ 20 сентября 2019

Может быть, из bs4 импортируя BeautifulSoup, мы могли бы извлечь страну, если бы все было в порядке:

from bs4 import BeautifulSoup
import re

string="""
<small class="text-muted">
                            <span class="hidden-xs">Football / </span>Indonesia / 
                            <span class="hidden-xs xh-highlight">Kick off: </span>11 Sep 2019, 11:30                            </small>
A

"""

soup = BeautifulSoup(string, 'html.parser').find_all('small')[0].text

print(re.findall(r'[^/]+/\s*([^/]+?)\s*/', soup)[0])

Вывод

Indonesia
...