Python BeautifulSoup findAll не возвращает все элементы? - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь извлечь данные из этого URL https://99airdrops.com/page/1/.

Код, который я написал ниже:

import requests
from bs4 import BeautifulSoup

url_str = 'https://99airdrops.com/page/1/'

page = requests.get(url_str, headers={'User-Agent': 'Mozilla Firefox'})

# soup = BeautifulSoup(page.text, 'lxml')
soup = BeautifulSoup(page.text, 'html.parser')

# print(soup.prettify())

print(len(soup.findAll('div')))

print(soup.find('div', class_='title'))

Моя проблема - строка print(len(soup.findAll('div')))только возвращая 23, и строка print(soup.find('div', class_='title')) печатает None.Команда find не находит элемент div с class_='title', хотя существует несколько экземпляров, и элемент div глубоко вложен в html-страницу, но это никогда не вызывало у меня проблем.

Я имеюпопытался использовать lxml и html.parser, но ни один не возвращает все элементы div.Я также попытался записать HTML в файл, прочитать его, а затем запустить BeautifulSoup с ним, но я получил те же результаты.Может кто-нибудь сказать мне, в чем проблема здесь?

Я также попробовал предложения здесь Beautiful Soup - `findAll` не захватывает все теги в SVG (` ElementTree` делает) , чтобы обновить мой lxmlпакет, но я сталкиваюсь с той же проблемой до сих пор.

Я также попробовал решения здесь BeautifulSoup не находит правильно проанализированные элементы без удачи.

1 Ответ

0 голосов
/ 21 сентября 2018

Похоже, что вы можете получить все данные, которые вы ищете, с помощью одного запроса.

>>> import requests
>>> r = requests.get('https://cdn.99airdrops.com/static/airdrops.json')
>>> data = r.json()
>>> len(data)
133

Например:

>>> import json; print(json.dumps(data.popitem(), indent=2))
[
  "pointium",
  {
    "unique": "pointium",
    "name": "Pointium",
    "currency": "PNT",
    "description": "Global Decentralized Platform for Point Management & Loyalty Program",
    "instructions": "<ol><li>Join Telegram <a href=\"https://t.me/pointium\" target=\"_blank\">@Pointium</a> and click \"Join Airdrop\" (+500 PNT) </li><li>Enter your e-mail (+200 PNT) </li><li><a href=\"https://twitter.com/POINTIUM_ICO\" target=\"_blank\">Follow Twitter</a> and submit your username (+500 PNT) </li><li>Confirm your details</li></ol>",
    "rating": "7.30",
    "addDate": "2018-04-20 06:23:03",
    "expirationDate": "2018-05-07",
    "startDate": "2018-04-07",
    "image": "https://cdn.99airdrops.com/static/pointium.jpeg",
    "joinLink": "https://www.pointium.org/airdrop",
    "sponsored": "0",
    "status": "0",
    "startDateFormatted": "7th of April",
    "expirationDateFormatted": "7th of May",
    "attributes": {
      "bitcointalk": "0",
      "category": "airdrop",
      "email": "1",
      "facebook": "0",
      "kyc": "0",
      "news": "https://twitter.com/POINTIUM_ICO",
      "opinion": "O parere personala este ca merge acest sistem foarte bine. Doar ca mai avem de lucrat la el sa fie bomba!",
      "other": "0",
      "phone": "0",
      "ratingConcept": "7",
      "ratingTeam": "5.5",
      "ratingWebsite": "7",
      "ratingWhitepaper": "8",
      "reddit": "0",
      "telegram": "1",
      "tokenGiven": "1200",
      "tokenPrice": "0.007",
      "tokenSupply": "1,600,000,000",
      "tokenType": "ERC20",
      "twitter": "1",
      "website": "www.pointium.org"
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...