#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 пробел. Это даст нам точное положение индекса, в котором находится фактическое количество зрителей.