Соскоб в сети с BeautifulSoup не будет работать - PullRequest
2 голосов
/ 19 апреля 2020

В конечном счете, я пытаюсь открыть все статьи новостного сайта, а затем составить топ-10 слов, используемых во всех статьях. Чтобы сделать это, я сначала хотел посмотреть, сколько существует статей, чтобы я мог их перебрать в какой-то момент, пока не понял, как я хочу все делать.

Для этого я хотел использовать BeautifulSoup4. Я думаю, что класс, который я пытаюсь получить, - Javascript, так как я ничего не получаю обратно. Это мой код:

url = "http://ad.nl"
ad = requests.get(url)
soup = BeautifulSoup(ad.text.lower(), "xml")
titels = soup.findAll("article")

print(titels)
for titel in titels:
    print(titel)

Название статьи иногда h2 или h3. У него всегда один и тот же класс, но я ничего не могу получить через этот класс. У него есть некоторые родители, но он использует то же имя, но с расширением -wrapper, например. Я даже не знаю, как использовать родителя, чтобы получить то, что я хочу, но я думаю, что эти классы тоже Javascript. Есть также ссылка, которая мне интересна. Но опять же, это, вероятно, также Javascript, поскольку ничего не возвращает.

Кто-нибудь знает, как я мог бы использовать что-нибудь (желательно href, но название статьи также было бы хорошо), используя BeautifulSoup?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Если вы не хотите использовать селен. Это работает для меня. Я пробовал на 2 ПК с различным подключением inte rnet. Можете ли вы попробовать?

from bs4 import BeautifulSoup
import requests

cookies={"pwv":"2",
"pws":"functional|analytics|content_recommendation|targeted_advertising|social_media"}

page=requests.get("https://www.ad.nl/",cookies=cookies)

soup = BeautifulSoup(page.content, 'html.parser')

articles = soup.findAll("article")

Затем следуйте кимбо-коду, чтобы извлечь h2 / h3.

1 голос
/ 19 апреля 2020

Как отметил @Sri в комментариях, когда вы открываете этот URL, у вас появляется страница, где вы должны сначала принять куки, что требует взаимодействия. Когда вам нужно взаимодействие, подумайте о том, чтобы использовать что-то вроде селена (https://selenium-python.readthedocs.io/).

Вот кое-что, с чего следует начать.

(Изменить: вам нужно выполните pip install selenium перед запуском этого кода ниже)

import requests
from bs4 import BeautifulSoup
from selenium import webdriver

url = 'https://ad.nl'

# launch firefox with your url above
# note that you could change this to some other webdriver (e.g. Chrome)
driver = webdriver.Firefox()
driver.get(url)

# click the "accept cookies" button
btn = driver.find_element_by_name('action')
btn.click()

# grab the html. It'll wait here until the page is finished loading
html = driver.page_source

# parse the html soup
soup = BeautifulSoup(html.lower(), "html.parser")
articles = soup.findAll("article")

for article in articles:
    # check for article titles in both h2 and h3 elems
    h2_titles = article.findAll('h2', {'class': 'ankeiler__title'})
    h3_titles = article.findAll('h3', {'class': 'ankeiler__title'})
    for t in h2_titles:
        # first I was doing print(t.text), but some of them had leading
        # newlines and things like '22:30', which I assume was the hour of the day
        text = ''.join(t.findAll(text=True, recursive=False)).lstrip()
        print(text)
    for t in h3_titles:
        text = ''.join(t.findAll(text=True, recursive=False)).lstrip()
        print(text)

# close the browser
driver.close()

Это может или не может быть именно то, что вы думаете, но это всего лишь пример того, как использовать селен и красивый суп. Не стесняйтесь копировать / использовать / изменять это по своему усмотрению. А если вам интересно, какие селекторы использовать, прочитайте комментарий @JL Peyret.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...