Получить все группы с длинной очереди - PullRequest
3 голосов
/ 29 октября 2019

У меня есть следующая строка:

aaa<a class="c-item_foot" href="/news/a/">11r11</a></div>bbb<a class="c-item_foot" href="/news/b/">222</a></div>ccgc<a class="c-item_foot" href="/news/c/">3333a333</a></div>ddd<a class="c-item_foot" href="/news/d/">44a444444</a></div>eee

Я пытаюсь получить следующие значения из этой строки:

  • 11r11
  • 222
  • 3333a333
  • 44a444444

Другими словами, для получения значений от <a class="c-item_foot" href="/news/*/"> до </a></div>. Я пытаюсь получить это следующим образом:

text=open("./string.txt","r").read()
print(u'\n'.join(re.findall(r"<a class=\"c-item_foot.*>(.*)</a></div>", text)))

Но получить только последнюю группу 44a444444. Может кто-нибудь показать мне правильный пример?

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Я предлагаю вам использовать HTML-библиотеку разбора, например BeautifulSoup.

html_doc = 'aaa<a class="c-item_foot" href="/news/a/">11r11</a></div>bbb<a class="c-item_foot" href="/news/b/">222</a></div>ccgc<a class="c-item_foot" href="/news/c/">3333a333</a></div>ddd<a class="c-item_foot" href="/news/d/">44a444444</a></div>eee'
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
values = [tag.text for tag in soup.find_all('a')]
0 голосов
/ 29 октября 2019

В Python есть HTML-парсер, который обеспечивает то, что вы ожидаете в этом случае.

Документация html.parser здесь .

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):

    def __init__(self):
        super().__init__()
        self.data = []
        self.a_tag = None

    def handle_starttag(self, tag, attrs):
        if tag == "a":
            self.a_tag = True

    def handle_data(self, data):
        if self.a_tag:
            self.data.append(data)
            self.a_tag = False

string = """aaa<a class="c-item_foot" href="/news/a/">11r11</a></div>bbb<a class="c-item_foot" href="/news/b/">222</a></div>ccgc<a class="c-item_foot" href="/news/c/">3333a333</a></div>ddd<a class="c-item_foot" href="/news/d/">44a444444</a></div>eee"""
parser = MyHTMLParser()
parser.feed(string)
print(parser.data)

OUTPUT:

['11r11', '222', '3333a333', '44a444444']
0 голосов
/ 29 октября 2019

У вас правильный подход, но вы должны использовать метод оценки lazy для регулярных выражений. Попробуйте вместо этого:

<a class=\"c-item_foot.*?>(.*?)<\/a><\/div>

Вы можете поиграть с регулярным выражением здесь: https://regex101.com/r/pggVVJ/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...