Как извлечь href, когда элемент ['href'] является гиперссылкой - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь очистить данные с веб-страницы и перейти к следующей странице, извлекая ссылку на следующую страницу.

Однако в этом случае тег, содержащий ссылку на следующую страницу is href = '# next'. При проверке этого элемента с помощью Chrome при наведении курсора на слово «#next» появляется гиперссылка, показывающая мне полный href.

Я подозреваю, что href теряется, когда я делаю запрос и преобразовать его в текст следующим образом:

r = requests.get(url)

s = BeautifulSoup(r.text)

Я использую функцию findAll(), чтобы получить искомый элемент:

s.findAll('a', class_='pagenav')[5]

результат:

a href="#next" class="pagenav" title="next page" onclick="javascript:
document.pageForm.limitstart.value=20; document.pageForm.submit();return false;">
Next >

Как я могу получить href в этом случае?

Это ссылка на сайт

https://associatedrealtorsaruba.com/index.php?option=com_ezrealty&Itemid=11&task=results&cnid=0&custom7=&custom8=&parking=&type=0&cid=0&stid=0&locid=0&minprice=&maxprice=&minbed=&maxbed=&min_squarefeet=&max_squarefeet=&bathrooms=&sold=0&lug=0&featured=0&custom4=&custom5=&custom6=&postcode=&radius=&direction=DEFAULT&submit=Search

1 Ответ

0 голосов
/ 08 января 2020

Если вы используете Selenium, тогда используйте Selenium, чтобы найти <a class="pagenav"> или <a title="next page"> и .click(), чтобы загрузить следующую страницу, и вам не нужно получать href для этого.

import selenium.webdriver

url = 'https://associatedrealtorsaruba.com/index.php?option=com_ezrealty&Itemid=11&task=results&cnid=0&custom7=&custom8=&parking=&type=0&cid=0&stid=0&locid=0&minprice=&maxprice=&minbed=&maxbed=&min_squarefeet=&max_squarefeet=&bathrooms=&sold=0&lug=0&featured=0&custom4=&custom5=&custom6=&postcode=&radius=&direction=DEFAULT&submit=Search'

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

# find link to next page
next_page = driver.find_element_by_xpath('//a[@title="next page"]')

# click link to load next page
next_page.click()

КСТАТИ: Если вы вручную загрузите страницы 1, 2 и 3 и сравните их URL в браузере, вы увидите единственную разницу в URL

for page 1: &limitstart=0 
for page 2: &limitstart=20 
for page 3: &limitstart=40 

и это способ загрузки следующей страницы без получения href - вам нужно получить исходный URL и добавить &limitstart= с правильным значением для загрузки другой страницы.


Если вы хотите чтобы отобразить 50 элементов на странице, вам нужно использовать &limit=50, а затем &limitstart придется использовать значения 0, 50, 100 и т. д. c.


РЕДАКТИРОВАТЬ:

с запросами

import requests
from bs4 import BeautifulSoup as BS

url = 'https://associatedrealtorsaruba.com/index.php?option=com_ezrealty&Itemid=11&task=results&cnid=0&custom7=&custom8=&parking=&type=0&cid=0&stid=0&locid=0&minprice=&maxprice=&minbed=&maxbed=&min_squarefeet=&max_squarefeet=&bathrooms=&sold=0&lug=0&featured=0&custom4=&custom5=&custom6=&postcode=&radius=&direction=DEFAULT&submit=Search'

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0', # need full UA
}

for x in (0, 20, 40):
    r = requests.get(url + '&limitstart={}'.format(x), headers=headers)
    print('\n---', x, '---\n')

    soup = BS(r.text, 'html.parser')

    all_items = soup.find_all('span', {'class': 'h3'})
    for item in all_items:
        print(item.get_text(strip=True))

с селеном

import selenium.webdriver

url = 'https://associatedrealtorsaruba.com/index.php?option=com_ezrealty&Itemid=11&task=results&cnid=0&custom7=&custom8=&parking=&type=0&cid=0&stid=0&locid=0&minprice=&maxprice=&minbed=&maxbed=&min_squarefeet=&max_squarefeet=&bathrooms=&sold=0&lug=0&featured=0&custom4=&custom5=&custom6=&postcode=&radius=&direction=DEFAULT&submit=Search'

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

while True:

    all_items = driver.find_elements_by_xpath('//span[@class="h3"]')
    for item in all_items:
        print(item.text)

    try:    
        # find link to next page
        all_items = driver.find_element_by_xpath('//a[@title="next page"]')

        # click link to load next page
        all_items.click()
    except Exception as ex:
        print('ex:', ex)
        break
...