Очистка текста от заголовка и тега Class - PullRequest
0 голосов
/ 01 мая 2020

В приведенном ниже коде ошибки при попытке выполнить эту строку "RptTime = TimeTable [0] .xpath ('// text ()')" Не уверен, почему я вижу, что TimeTable имеет значение в моем переменное окно, но HtmlElement "TimeTable [0]" не имеет значения, а "content.cssselect" во время назначения возвращает значение. Почему тогда я получаю сообщение об ошибке «Список индексов вне диапазона» . Это говорит мне, что элемент пуст. Я пытаюсь получить значение Месяц года в этом поле.

import pandas as pd
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={"content-type":"text"})
    else:
       content = requests.get(url, params=payload, verify=False, headers={"content-type":"text"})

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

    if parse:
       return html.fromstring(content.text), 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


cmslinks=[
'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/MCRAdvPartDEnrolData/Monthly-Contract-and-Enrollment-Summary-Report?items_per_page=100&items_per_page_options%5B5%5D=5%20per%20page&items_per_page_options%5B10%5D=10%20per%20page&items_per_page_options%5B25%5D=25%20per%20page&items_per_page_options%5B50%5D=50%20per%20page&items_per_page_options%5B100%5D=100%20per%20page&combine=&page=0',
'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/MCRAdvPartDEnrolData/Monthly-Contract-and-Enrollment-Summary-Report?items_per_page=100&items_per_page_options%5B5%5D=5%20per%20page&items_per_page_options%5B10%5D=10%20per%20page&items_per_page_options%5B25%5D=25%20per%20page&items_per_page_options%5B50%5D=50%20per%20page&items_per_page_options%5B100%5D=100%20per%20page&combine=&page=1']


df=pd.DataFrame()
df2=pd.DataFrame()
for cmslink in cmslinks:
   print(cmslink)
   content, _ = http_request_get(url=cmslink,payload={'t':''},parse=True)
   linkTable = content.cssselect('td[headers="view-dlf-1-title-table-column"]')[0]
   TimeTable = content.cssselect('td[headers="view-dlf-2-report-period-table-column"]')[0]
   headers = linkTable[0].xpath("//a[contains(text(),'Contract Summary') or contains(text(),'Monthly Enrollment by CPSC')]/@href")
   RptTime =  TimeTable.xpath('//text()')  
   dfl = pd.DataFrame(headers,columns= ['links'])
   dft = pd.DataFrame(RptTime,columns= ['ReportTime'])
   df=df.append(dfl)
   df2=df.append(dft)

Ошибка

src\lxml\etree.pyx in lxml.etree._Element.__getitem__()

IndexError: list index out of range

1 Ответ

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

Посмотри внимательно на свою последнюю строчку. df = df.append(df1). Ваше объяснение и код довольно неясны из-за отступа и отслеживания ошибок, однако это, очевидно, не то, что вы намеревались.

df.append(df1) - это скорее процедура, а не только функция, она ничего не возвращает. Вы просто пишете строку, и она делает свои маги c похожими на print("hi"), а не this_is_wrong = print("hi").

Что в итоге произойдет, если вы перезаписаете df воли null, что должно вызывать некоторые основные ошибки, если вы когда-нибудь снова будете использовать эту переменную. Однако это не является причиной вашей проблемы. Я все равно считал своим долгом сообщить вам.

Не могли бы вы рассказать нам точно , что возвращает функция css.... Хотя вы сказали, что он возвратил что-то, вы сохраняете только индекс [0] возвращаемого значения. Это означает, что если гипотетически это ["","something"], то сохраненное значение будет null.

Вполне вероятно, что у вас проблема в том, что вы проиндексировали [0] дважды , когда вы, вероятно, хотели сделать это только один раз.

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