Не удается получить доступ к контенту с помощью Beautifulsoup

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь очистить этот веб-сайт, мой код для очистки веб-сайта

 ua1 = 'Mozilla/5.0 (compatible; Googlebot/2.1;  http://www.google.com/bot.html)'
ua2 = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome'
headers = {'User-Agent': ua2,
           'Accept': 'text/html,application/xhtml xml,application/xml;' 
                     'q=0.9,image/webp,*/*;q=0.8'}
session = requests.Session()
response = session.get("website--link", headers=headers)
webContent = response.content


root_tag=["div", {"class": "qtxgkq-0"}]
image_tag=["img",{"":""},"src"]

bs = BeautifulSoup(webContent, 'lxml')
all_tab_data = bs.findAll(root_tag[0], root_tag[1])

output=[]
for div in all_tab_data:
    image_url = None
    div_img = str(div)
    match = re.search(r"(http(s?):)([/|.|w|s|-])*.(?:jpg|gif|png|jpeg)", div_img)
    if match!=None:
        image_url = match.group(0)
    else:
        image_url = div.find(image_tag[0],image_tag[1]).get(image_tag[2])
    if image_url!=None:
        if image_url[0] == '/' and image_url[1] != '/':
            image_url = main_url   image_url
    print(image_url)
    output.append(image_url)
  

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

 root_tag=["div", {"class": "b01o18-0 kpPYYo"}]
  

все еще получаю пустой список

Ответ №1:

Ваш код в порядке, но вы пропустили одну важную часть. Они отображают эту часть сайта через javascript, чего ваш запрос не сделает 😉 Вы просто получаете html. Но данные есть, просто не там, где вы ожидаете, что они будут. Это в теге script в виде json.

 import json
data = json.loads(bs.findAll('script', {'id': '__NEXT_DATA__'})[0].text)
  

И перейти оттуда.

 for article in data['props']['pageProps']['articles']:
    image_url = article['image']['url']
    if not image_url.startswith('http'):
        image_url = 'https:'   image_url
    print(image_url)
    # They use slug to build their news url, it's relative.
    slug = article['slug']
    # full url to news article
    news_url = f'{main_url}/{slug}'
  

Комментарии:

1. Но как я получу URL-адрес новости measn, когда мы нажмем на определенную статью [‘title’], она перенаправит меня на новую страницу. Мне также нужен URL перенаправленной страницы. и в json нет URL-адреса, который я могу извлечь

2. Да, вы можете. slug Поле содержит используемый ими фрагмент. Просто сделайте main_url ‘/’ article[‘slug’]