Как извлечь данные из двух похожих элементов класса HTML, используя регулярное выражение? - PullRequest
1 голос
/ 07 апреля 2019

Как извлечь количество голосов «за» ( 215 ) и «против» ( 82 ) из следующего фрагмента HTML, используя регулярное выражение python?

<span class="vote-actions">
    <a class="btn btn-default vote-action-good">
        <span class="icon thumb-up black black-hover">&nbsp;</span>
        <span class="rating-inbtn">215</span>
    </a>
    <a class="btn btn-default vote-action-bad">
        <span class="icon thumb-down grey black-hover">&nbsp;</span>
        <span class="rating-inbtn">82</span>
    </a>
</span>

Я отформатировал HTML-код, но в исходном коде нет символов '\ n' или '\ t'.

К вашему сведению, я не ожидаю никакого красивого супового решения.Я ищу функцию поиска Python Re.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

не используйте регулярные выражения для анализа html https://stackoverflow.com/a/1732454/412529

вот как это сделать с BeautifulSoup:

html = '''<span class="vote-actions">...'''
import bs4
soup = bs4.BeautifulSoup(html)
soup.select("a.vote-action-good span.rating-inbtn")[0].text  # '215'
soup.select("a.vote-action-bad span.rating-inbtn")[0].text  # '82'
2 голосов
/ 07 апреля 2019

Чтобы найти оба числа, я бы сделал

text = '''<span class="vote-actions">
    <a class="btn btn-default vote-action-good">
        <span class="icon thumb-up black black-hover">&nbsp;</span>
        <span class="rating-inbtn">215</span>
    </a>
    <a class="btn btn-default vote-action-bad">
        <span class="icon thumb-down grey black-hover">&nbsp;</span>
        <span class="rating-inbtn">82</span>
    </a>
</span>'''

import re

a = re.findall('rating-inbtn">(\d+)', text)
print(a)

['215', '82']

В HTML я вижу, что первое число - Up, а второе - Down, поэтому мне не нужен лучший метод.

up = a[0]
down = a[1]

Если этого недостаточно, я бы использовал HTML-парсер

text = '''<span class="vote-actions">
    <a class="btn btn-default vote-action-good">
        <span class="icon thumb-up black black-hover">&nbsp;</span>
        <span class="rating-inbtn">215</span>
    </a>
    <a class="btn btn-default vote-action-bad">
        <span class="icon thumb-down grey black-hover">&nbsp;</span>
        <span class="rating-inbtn">82</span>
    </a>
</span>'''

import lxml.html

soup = lxml.html.fromstring(text)

up = soup.xpath('//a[@class="btn btn-default vote-action-good"]/span[@class="rating-inbtn"]')
up = up[0].text
print(up)

down = soup.xpath('//a[@class="btn btn-default vote-action-bad"]/span[@class="rating-inbtn"]')
down = down[0].text
print(down)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...