Красивый суп извлеките несколько ссылок, если они есть - PullRequest
0 голосов
/ 05 мая 2020

Я хотел бы просканировать страницу, указанную ниже, и извлечь 2 ссылки для скачивания, которые она предоставляет. Я не могу использовать имена тегов, так как они всегда будут меняться. Также бывают случаи, когда есть только 1 ссылка. Код ошибки, потому что он говорит, что нет атрибута "a". Есть, но не знаю, как пройти 3 узла вниз.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-html lang-html prettyprint-override"><code>    <ul class="field__items">
        <li class="field__item">
           <div class="media media--type-zip media--view-mode-file-list">
               <a href="/files/zip/pdp-enrollment-statecountycontract-january-2020-full-version.zip">PDP Enrollment by State/County/Contract – January 2020 - Full version (ZIP)</a>
        </div>
    </li>
                                <li class="field__item">

    <div class="media media--type-zip media--view-mode-file-list">
      
                <a href="/files/zip/pdp-enrollment-statecountycontract-january-2020-abridged-version-exclude-rows-10-or-less-enrollees.zip">PDP Enrollment by State/County/Contract – January 2020 - Abridged version to exclude rows with 10 or less enrollees (ZIP)</a>
        </div>
    </li>
</ul>

Код

import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime
from lxml import html
import requests

def http_request_get(url, session=None, payload=None, parse=True):
""" Sends a GET HTTP request to a website and returns its HTML content and full url address. """

if payload is None:
  payload = {}

if session:
   content = session.get(url, params=payload, verify=False, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',"content-type":"text"})
else:
   content = requests.get(url, params=payload, verify=False, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',"content-type":"text"})

content.raise_for_status()  # Raise HTTPError for bad requests (4xx or 5xx)

if parse:
   return BeautifulSoup(content.text, 'html.parser'), content.url
else:
   return content.text, content.url

def get_html(link):
 """
 Returns a html.
 """
page_parsed, _ = http_request_get(url=link, payload={'t': ''}, parse=True)
 return page_parsed


cmslink =  'https://www.cms.gov/research-statistics-data-and-systemsstatistics-trends-and-reportsmcradvpartdenroldatamonthly-pdp/pdp-enrollment-scc-2020-01'

df = pd.DataFrame()
content, _ = http_request_get(url=cmslink,payload={'t':''},parse=True)
table = content.find("div", class_="field__items").a['href'] 

1 Ответ

0 голосов
/ 05 мая 2020

Класс, который вы ищете, который имеет тег ul Not тег div.

Чтобы получить все значения href, используйте это. Это сохранит все значения href в списке .

table =[ a['href'] for a in content.find("ul", class_="field__items").find_all('a')]
print(table)
...