#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;
.