Используя Beautifulsoup для разбора большого комментария? - PullRequest
0 голосов
/ 29 ноября 2018

Я использую BS4 для анализа этой веб-страницы : вы заметите, что на странице есть две отдельные таблицы.Вот соответствующий фрагмент моего кода, который успешно возвращает данные, которые мне нужны из первой таблицы, но не находит ничего из второй таблицы:

# import packages
import urllib3
import certifi
from bs4 import BeautifulSoup
import pandas as pd

#settings
http = urllib3.PoolManager(
        cert_reqs='CERT_REQUIRED',
        ca_certs=certifi.where())
gamelog_offense = []

#scrape the data and write the .csv files
url = "https://www.sports-reference.com/cfb/schools/florida/2018/gamelog/"
response = http.request('GET', url)
soup = BeautifulSoup(response.data, features="html.parser")
cnt = 0

for row in soup.findAll('tr'):
    try:
        col=row.findAll('td')
        Pass_cmp = col[4].get_text()
        Pass_att = col[5].get_text()
        gamelog_offense.append([Pass_cmp, Pass_att])
        cnt += 1
    except:
        pass
print("Finished writing with " + str(cnt) + " records")
Finished writing with 13 records

Я проверил данные из таблицы ВТОРОЙсодержится в супе (я вижу это!).После многих проблем я обнаружил, что вся вторая таблица полностью содержится в одном большом комментарии (почему?).Мне удалось извлечь этот комментарий в один объект комментария, используя приведенный ниже код, но я не могу понять, что с ним делать после этого, чтобы извлечь нужные мне данные.В идеале я хотел бы проанализировать комментарий таким же образом, как я успешно разбираю первую таблицу.Я попытался использовать идеи из аналогичных вопросов переполнения стека (селен, фантомы) ... не повезло.

import bs4
defense = soup.find(id="all_defense")
for item in defense.children:
    if isinstance(item, bs4.element.Comment):
        big_comment = item
print(big_comment)
<div class="table_outer_container">
  <div class="overthrow table_container" id="div_defense">
   ...and so on....

1 Ответ

0 голосов
/ 29 ноября 2018

Размещение ответа здесь на случай, если другие сочтут полезным.Огромное спасибо @TomasCarvalho за указание найти решение.Я смог передать большой комментарий в виде html во второй экземпляр супа, используя следующий код, а затем просто использовать исходный код синтаксического анализа для нового экземпляра супа.(примечание: попытка / исключение заключается в том, что у некоторых команд нет игрового журнала, и вы не можете вызвать .children для NoneType.

try:
    defense = soup.find(id="all_defense")
    for item in defense.children:
        if isinstance(item, bs4.element.Comment):
            html = item
    Dsoup = BeautifulSoup(html, features="html.parser")
except:
    html = ''
    Dsoup = BeautifulSoup(html, features="html.parser")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...