Не удается удалить данные таблицы с помощью BeautifulSoup с веб-сайта - PullRequest
1 голос
/ 12 апреля 2019

Я слежу за онлайн-учебником (https://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/) для очистки веб-таблицы в формате html. Когда я следовал учебнику, мне удалось удалить данные таблицы, но я попытался удалить данные из этого (https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11) веб-сайт Я не смог этого сделать.

Я пытался использовать scrapy раньше, но получил те же результаты.

Вот код, который я использовал.

import urllib.request

wiki = "https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11"
page = urllib.request.urlopen(wiki)
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, "lxml")


all_tables=soup.find_all('table')


right_table=soup.find('table', class_='zebra-body-only')
print(right_table)

Это то, что я получаю, когда запускаю этот код на терминале

<table cellspacing="0" class="zebra-body-only">
<tbody id="target-area">
</tbody>
</table>

Хотя, когда я проверяю сайт массовой лотереи с помощью Google Chrome, это то, что я вижу

<table cellspacing="0" class="zebra-body-only"                                  <tbody id="target-area">
<tr class="odd">
<th>Draw #</th>
<th>Draw Date</th>
<th>Winning Number</th>
<th>Bonus</th>
</tr>
<tr><td>2107238</td>
<td>03/04/2019</td>
<td>01-04-05-16-23-24-27-32-34-41-42-44-47-49-52-55-63-65-67-78</td><td>No Bonus</td>
</tr>
<tr class="odd">
<td>2107239</td>
<td>03/04/2019</td>
<td>04-05-11-15-19-20-23-24-25-28-41-45-52-63-64-68-71-72-73-76</td><td>4x</td>
</tr> 
....(And so on)

Я хочу иметь возможность извлекать данные из этой таблицы.

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Это происходит потому, что веб-сайт делает еще один вызов для загрузки результатов. Исходная ссылка загружает только страницу, но не результаты. Используя инструменты разработки Chrome для проверки запросов, вы сможете найти запрос, который нужно повторить для получения результатов.

Это означает, что для получения результатов вы можете просто позвонить по указанному выше запросу и вообще не заходить на веб-страницу.

К счастью, конечная точка, которую вам нужно вызвать, уже находится в хорошем формате JSON.

GET https://www.masslottery.com/data/json/search/dailygames/history/15/201903.json?_=1555083561238

Где я предполагаю 1555083561238 - это отметка времени.

0 голосов
/ 13 апреля 2019

да, я бы сохранил данные, которые вы получили, в файл, чтобы увидеть, действительно ли то, что вы ищете, действительно там.с открытым ('stuff.html', 'w') как f: f.write (response.text)

unicode, попробуйте: импортировать кодеки codecs.open (fp, 'w', 'utf-8') как f:

Если вы не видите, что ищете, вам нужно будет найти правильный URL-адрес для загрузки, проверьте параметры разработчика Chrome, обычно это трудно

простой маршрутчтобы использовать селен, убедитесь, что вы ожидаете, пока то, что вы ищете, появилось на странице (это динамично)

0 голосов
/ 12 апреля 2019

Страница динамическая, поэтому она отображается после выполнения запроса. Вы можете либо: а) использовать решение JC1 и получить доступ к ответу json. Или вы можете использовать Seleneium для имитации открытия браузера, рендеринга страницы, а затем захвата таблицы:

from bs4 import BeautifulSoup
from selenium import webdriver


url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11'  

driver = webdriver.Chrome()
driver.get(url)
page = driver.page_source

soup = BeautifulSoup(page, "lxml")

all_tables=soup.find_all('table')


right_table=soup.find('table', class_='zebra-body-only')

Также в качестве примечания: Обычно, если я вижу теги <table>, я позволяю Пандам делать всю работу за меня (обратите внимание, я заблокирован от доступа к сайту, поэтому не могу их протестировать):

import pandas as pd
from selenium import webdriver


url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11'  

driver = webdriver.Chrome()
driver.get(url)
page = driver.page_source

# will return a list of dataframes
tables = pd.read_html(page)

# chose the dataframe you want from the list by it's position
df = tables[0]
...