#python #selenium
#python #selenium
Вопрос:
Я пытаюсь очистить «https://beta.sam.gov/search ?ключевые слова =amp;sort=-ModifiedDateamp;index=oppamp;is_active=trueamp;page = 1 «. сначала я пытаюсь найти все подразделения, в которых есть сведения о возможностях. (Я закончил с этим) Я получаю некоторую базовую информацию с этой страницы, например, даты и названия возможностей. но мне также нужно получить полное описание, для этого я должен нажать на его заголовок, который приведет нас на новую страницу. Я должен получить подробное описание с этой новой страницы и вернуться на родительскую страницу, чтобы использовать следующие возможности.
как я могу это сделать? ниже приведен мой код, который я пробовал, но не смог получить ожидаемый результат.
from selenium import webdriver
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")
driver = webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome( options=options ,executable_path="D:/chromedriver.exe")
baseLink = "https://beta.sam.gov"
lastPageNumber = 2
currentpage = 1
# getting source code of each parent page , like page = 1,2,3 until the last page.
def startscrapping(currentpage):
driver.get(f'https://beta.sam.gov/search?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page={currentpage}')
source = driver.page_source
soup = BeautifulSoup(source, 'lxml')
return soup
# getting the last index for the parent page to be scrapped
def findLastPageIndex():
soup = startscrapping(1)
results = soup.find("ul", {"aria-label" : "pagination"}).findAll('li',"ng-star-inserted")
if results is not None:
lastPageNumber= int(results[-2].text.strip())
findLastPageIndex()
while currentpage <= lastPageNumber :
soup = startscrapping(currentpage)
outerDivs = soup.find_all(attrs={"tabindex": "-1" , "class": "ng-tns-c1-1 ng-star-inserted"})
print(f"page number = {currentpage}")
for index,item in enumerate(outerDivs):
title = item.find("h3" , class_= "opportunity-title").text.strip()
#....some other codes for finding title and dates
# trying to click on the link
driver.find_element_by_xpath(f"//*[@id='search-results']/div[{index 1}]/opportunities-result/div/div/div[1]/h3/a").click()
handles = driver.window_handles
size = len(handles)
print(f"length of handles = {size}")
parent_handle = driver.current_window_handle
for x in range(size):
if handles[x] != parent_handle:
# trying to swith on the new window
driver.switch_to.window(handles[x])
print(driver.title)
driver.close()
break
driver.switch_to.window(parent_handle)
break
break
Вы также можете увидеть фотографии, которые я прикрепил для получения дополнительной информации
Ответ №1:
Вместо того, чтобы нажимать на ссылку, попробуйте очистить ссылку и открыть ссылку на новой вкладке. Вот как вы это делаете:
source = driver.page_source
soup = BeautifulSoup(source, 'lxml')
a_tags = soup.find_all('a',class_ = "wordbreak")
url_lst = []
for a in a_tags:
url_lst.append("https://beta.sam.gov/" a['href'])
print(url_lst)
Вывод:
['https://beta.sam.gov//opp/26d35e6fa6e64a8099cf37e592ea54d0/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/5a07648db5034fd590ce2d3526eea366/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/7fd9b43ec7734708b23f6cacb189bf7f/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/1a9d2d5d61ac4deba9d6cc973b684176/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/b7eb9430de724dd58bf9c4c76c0d8652/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/f70317667944475981fbcbfd52a6f86e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/b39489e47c8a41c6801499de4d908dad/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/dcaa31871a174dd3a136b276dbf0040e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/401b8fd7f2234ffcbf4476523413ba40/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/7c61c39c6cd24d52bbb34feea9fcf69e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1']
Затем вы можете выполнить итерацию по этому списку, открыть все ссылки одну за другой на новой вкладке и выполнить нужное действие. Надеюсь, что это поможет!
Комментарии:
1. Отвечает ли это на ваш вопрос? И помогло ли это вам?
Ответ №2:
Вы можете сделать это, чтобы переключиться на новую вкладку и вернуться к родительскому.
parent=driver.current_window_handle
#Use a for loop
driver.execute_script("window.open('{0}', '_blank');".format(url))
driver.switch_to.window(len(driver.window_handles)-1)
#Do whatever you want
driver.close()
driver.switch_to.window(parent)
Комментарии:
1. зачем мне нужно использовать цикл for? что следует повторить?
2. У меня есть страница 1000, на каждой странице 10 разделов, и у каждого раздела есть одна ссылка, по которой я должен посетить ее и выполнить свою работу, и мне нужно вернуться к следующему разделу, снова открыть его ссылку, … для переключения первой страницы требуется 10 раз, а второй страницы снова 10 раз….
3. Если вы возьмете все ссылки href, вы можете просто зациклить их таким образом, чтобы перейти на их страницы и обратно.
4. Где URL-адрес является значением ahref.