Как получить более 20 ссылок на заголовки новостей для подраздела (например, Ближнего Востока) сайта Reuters, использующего Python? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь почистить сайт Reuters для всех заголовков новостей, касающихся Ближнего Востока.Ссылка на веб-страницу: https://www.reuters.com/subjects/middle-east

На этой странице автоматически отображаются предыдущие заголовки при прокрутке вниз, но при просмотре источника страницы отображаются только последние 20 ссылок заголовков.

Я пыталсяискать следующую или предыдущую гиперссылку, которая обычно присутствует для таких проблем, но, к сожалению, на этой странице нет такой гиперссылки.

import requests
from bs4 import BeautifulSoup
import re
url = 'https://www.reuters.com/subjects/middle-east'

result = requests.get(url)
content = result.content
soup = BeautifulSoup(content, 'html.parser')  

# Gets all the links on the page source
links = []
for hl in soup.find_all('a'):
    if re.search('article', hl['href']):
        links.append(hl['href'])

# The first link is the page itself and so we skip it
links = links[1:]

# The urls are repeated and so we only keep the unique instances
urls = []
for url in links:
    if url not in urls:
        urls.append(url)

# The number of urls is limited to 20 (THE PROBLEM!)
print(len(urls))

У меня очень ограниченный опыт со всем этим, но я стараюсьПредполагается, что java или любой другой язык кода, который использует страница, заставляет ее показывать предыдущие результаты при прокрутке вниз и, возможно, это то, что мне нужно выяснить, чтобы использовать какой-то модуль Python.

Код идет дальшеизвлекать другие детали из каждой из этих ссылок, но это не имеет отношения к опубликованной проблеме.

1 Ответ

0 голосов
/ 29 января 2019

Вы можете использовать опции Селен и Keys.PAGE_DOWN, чтобы сначала прокрутить вниз, а затем получить источник страницы.Затем вы можете передать его в BeautifulSoup, если хотите.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re

browser = webdriver.Chrome(executable_path='/path/to/chromedriver')
browser.get("https://www.reuters.com/subjects/middle-east")
time.sleep(1)

elem = browser.find_element_by_tag_name("body")
no_of_pagedowns = 25
while no_of_pagedowns:
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.2)
    no_of_pagedowns-=1

source=browser.page_source
soup = BeautifulSoup(source, 'html.parser')

# Gets all the links on the page source
links = []
for hl in soup.find_all('a'):
    if re.search('article', hl['href']):
        links.append(hl['href'])

# The first link is the page itself and so we skip it
links = links[1:]

# The urls are repeated and so we only keep the unique instances
urls = []
for url in links:
    if url not in urls:
        urls.append(url)

# The number of urls is limited to 20 (THE PROBLEM!)
print(len(urls))

Ouput

40
...