Поиск по стилю (цвету) с помощью requests_html

#javascript #python #web-scraping #find #python-requests-html

Вопрос:

Я должен использовать requests_html для контента JavaScript. Код:

 lt;td class="text-left worker-col truncated"gt;lt;a href="/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fa/38-G1x" style="color:red"gt;38-G1lt;/agt;lt;/tdgt;  

Я хочу найти все имена (в данном случае 38-G1) красным цветом. Я хочу застать их врасплох style="color:red" . Возможно ли это с requests_html помощью ? Как я могу это сделать?

Ответ №1:

Я использую как html-сессию, так и selenium с bs4. Selenium работает нормально, но html-сессия не может отображать js.

Код с селеном.(Успех)

 from bs4 import BeautifulSoup import time from selenium import webdriver   driver = webdriver.Chrome('chromedriver.exe') url = URL driver.get(url) time.sleep(8)  soup = BeautifulSoup(driver.page_source, 'html.parser') for t in soup.select('table.table.table-bordered.table-hover.table-responsive tr'):  txt= t.select_one('td:nth-child(2) gt; a')  text= txt.text if txt else None  print(text)  

Выход:

 38-G15 47_G15_2  47-G1  49-O15  90_GGX  91_ASF  105_MGPM_3  112-GG3  121-APRO  188-MGPM1  198-AP  248_MGPM_1  262-GUD  265_ASF  302-AD  355-GUD.2  Rig_3471855 rigEdge  107_MGPM_3  None None  

Код с сеансом html(без рендеринга js)

 from bs4 import BeautifulSoup  from requests_html import HTMLSession  session = HTMLSession()  response = session.get(URL)  soup = BeautifulSoup(response.content, 'html.parser')    for t in soup.select('table.table.table-bordered.table-hover.table-responsive tr'):  txt= t.select_one('td:nth-child(2) gt; a')  text= txt.text if txt else None  print(text)  

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

1. Большое вам спасибо, с Селеном я это получил 🙂

Ответ №2:

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

Вы можете захватить страницу таким образом, как это сделал Фазлул:

 from bs4 import BeautifulSoup as bs import time from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage')  driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)  driver.get("URL") time.sleep(5)  html = bs(driver.page_source, 'html.parser')  

затем вы можете либо использовать селектор подстановочных знаков CSS, либо распечатать их внутренний текст:

 anchors = html.select('a[style*="color:red"]')  print([a.text for a in anchors])  

или

Вы можете найти все lt;agt; теги и поместить их в список, если у них есть этот атрибут.

 anchors = html.select('a')  names = [] for a in anchors:  if 'style' in a.attrs and "color:red" in a.attrs['style']:  names.append(a.text)  

Редактировать: Я вижу, что другой пользователь дал вам решение с BeautifulSoup, и я хотел бы добавить, что если вы новичок в веб-создании, но планируете узнать больше, я бы также рекомендовал научиться использовать BeautifulSoup. Он не только более мощный, но и его пользовательская база намного больше, поэтому вам будет легче найти решения для вашей проблемы.

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

1. Я не знаю почему, но anchors = r.html.find('a') этого не произошло lt;a href="/account/0x58e0ff2eb3addd3ce75cc3fbdac3ac3f4e21fa/38-G1x" style="color:red"gt;38-G1lt;/agt; .