Выбор всех элементов, соответствующих критериям, с помощью selenium (python)

#python #selenium #selenium-webdriver

#питон #selenium #selenium-webdriver

Вопрос:

Используя selenium, есть ли способ заставить скрипт выбирать элементы, соответствующие определенным критериям?

Что я именно пытаюсь сделать, так это заставить selenium выбрать все каналы Twitch, у которых более X зрителей. Если вы проверите элемент, вы обнаружите следующее:

 <p class="info"
    562
    viewers on
    <a class="js-profile-link" href="/hey_jase/profile" 
    data-tt_content="live_channel" data-tt_content_index="1"
    data-tt_medium="twitch_directory" data-ember-action="1471">
    Hey_Jase
    </a>
</p>
 

Ответ №1:

Прежде всего, вы можете найти все ссылки на каналы twitch. Затем отфильтруйте их на основе количества просмотров.

Что-то в этом роде:

 import re
from selenium import webdriver


THRESHOLD = 100  

driver = webdriver.Firefox()
driver.get("url")

pattern = re.compile(r"(d )s viewers on")
for link in driver.find_elements_by_css_selector("p.info a[data-tt_content=live_channel]"):
    text = link.find_element_by_xpath("..").text  # get to the p parent element
    match = pattern.search(text)  # extract viewers count
    if match:
        viewers_count = int(match.group(1))
        if viewers_count >= THRESHOLD:
            print(link.text, viewers_count)
 

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

1. Что вы импортируете и откуда берется параметр для шаблона?

2. @Astrum Я добавил немного больше к фрагменту, надеясь сделать его немного понятнее. Шаблон заключается в извлечении количества зрителей из текста элемента p.

3. Я действительно заблудился. Думаю, я просто перечислю свои вопросы. 1. что такое re.compile и откуда берется этот параметр. 2. Откуда вы взяли этот css-путь? Когда я использую firebug для поиска пути к элементу viewer, я получаю очень длинную строку. 3. Что такое text = …? что делаешь? Я думал, что метод css_selector находит наши элементы.

4. Я на самом деле отредактировал строку , чтобы «p.info » и оставил все остальное без изменений, и это сработало. Тогда мой вопрос заключается в том, что делает «match = …xpath («..»)»? И я предполагаю, что match.group() просто берет все возвращаемые элементы и группирует их в массив?

5. @Astrum хорошо, эта .. часть приводит нас к родительскому элементу текущего. match.group() Извлекает группу захвата из сопоставления.

Ответ №2:

Трудно дать точный код, поскольку мы получаем только небольшой образец HTML-кода, но это должно сработать, если вы его немного подправите.

 from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://www.website.com')

source = driver.page_source
location = source.find('<p class="info"')
source = source[location 16:] #adjust the  16 to maybe  15 or w/e depending on the exact source page you get
location_second = source.find('viewers on') #assuming there is a space between the actual number of viewers and the
source = int(source[:location_second-1])  #adjust the -1 to maybe -2 or w/e depending on the exact source page you get
if source > x: # replace x with whatever number is your minimum viewers
    driver.find_element_by_class_name('js-profile-link') #might need to use x-path if you have multiple instances of the same class name
 

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

1. Что именно делает источник [местоположение 16]? .

2. источник = источник [местоположение 16:] -> местоположение — это позиция индекса текста «<p class=»info»» и 16, потому что у вас есть 15 букв в «<p class=»info»» 1 пробел. Это даст нам точное положение индекса, в котором находится фактическое количество зрителей.