#python-3.x #python-2.7 #web-scraping #beautifulsoup
#python-3.x #python-2.7 #очистка веб-страниц #beautifulsoup
Вопрос:
У меня возникли проблемы со старым рабочим кодом, который больше не работает корректно.
Мой код на python очищает веб-сайт с помощью beautiful soup и извлекает данные о событиях (дата, событие, ссылка).
Мой код извлекает все события, которые находятся в tbody
. Каждое событие хранится в <tr class="Box">
. Проблема в том, что мой скребок, похоже, останавливается после этого <tr style ="box-shadow: none;>
После того, как он достигает этого раздела (который представляет собой раздел, содержащий 3 рекламы на сайте для событий, которые я не хочу очищать), код перестает извлекать данные о событиях из <tr class="Box">
. Есть ли способ пропустить этот стиль tr / игнорировать будущие случаи?
import pandas as pd
import bs4 as bs
from bs4 import BeautifulSoup
import urllib.request
import warnings
warnings.filterwarnings("ignore", category=UserWarning, module='bs4')
source = urllib.request.urlopen('https://10times.com/losangeles-us/technology/conferences').read()
soup = bs.BeautifulSoup(source,'html.parser')
#---Get Event Data---
test1=[]
table = soup.find('tbody')
table_rows = table.find_all('tr') #find table rows (tr)
for x in table_rows:
data = x.find_all('td') #find table data
row = [x.text for x in data]
if len(row) > 2: #Exlcudes rows with only event name/link, but no data.
test1.append(row)
test1
Ответ №1:
Данные загружаются динамически через JavaScript, поэтому вы не видите больше результатов. Вы можете использовать этот пример для загрузки большего количества страниц:
import requests
from bs4 import BeautifulSoup
url = "https://10times.com/ajax?for=scrollamp;path=/losangeles-us/technology/conferences"
params = {"page": 1, "ajax": 1}
headers = {"X-Requested-With": "XMLHttpRequest"}
for params["page"] in range(1, 4): # <-- increase number of pages here
print("Page {}..".format(params["page"]))
soup = BeautifulSoup(
requests.get(url, headers=headers, params=params).content,
"html.parser",
)
for tr in soup.select('tr[class="box"]'):
tds = [td.get_text(strip=True, separator=" ") for td in tr.select("td")]
print(tds)
С принтами:
Page 1..
['Tue, 29 Sep - Thu, 01 Oct 2020', 'Lens Los Angeles', 'Intercontinental Los Angeles Downtown, Los Angeles', 'LENS brings together the entire Degreed community - our clients, invited prospective clients, thought leaders, partners, employees, executives, and industry experts for two days of discussion, workshops,...', 'Business Services IT amp; Technology', 'Interested']
['Wed, 30 Sep - Sat, 03 Oct 2020', 'FinCon', 'Long Beach Convention amp; Entertainment Center, Long Beach 20.1 Miles from Los Angeles', 'FinCon will be helping financial influencers and brands create better content, reach their audience, and make more money. Collaborate with other influencers who share your passion for making personal finance...', 'Banking amp; Finance IT amp; Technology', 'Interested 7 following']
['Mon, 05 - Wed, 07 Oct 2020', 'NetDiligence Cyber Risk Summit', 'Loews Santa Monica Beach Hotel, Santa Monica 14.6 Miles from Los Angeles', 'NetDiligence Cyber Risk Summit will conference are attended by hundreds of cyber risk insurance, legal/regulatory and security/privacy technology leaders from all over the world. Connect with leaders in...', 'IT amp; Technology', 'Interested']
... etc.
Комментарии:
1. Спасибо за приведенный выше ответ. Однако я не знал об этом, ваше решение имеет смысл для меня!