Использование BeautifulSoup & для l oop для извлечения данных - PullRequest
1 голос
/ 02 апреля 2020

У меня проблемы с возвратом всех нужных данных из части веб-страницы с помощью BeautifulSoup. Когда я запускаю приведенный ниже python, for-l oop возвращает только первую найденную запись, а не весь набор данных с веб-страницы:

import requests  
from bs4 import BeautifulSoup  
r = requests.get('https://www.ncsl.org/research/health/state-action-on-coronavirus-covid-19.aspx')
soup = BeautifulSoup(r.text, 'html.parser')  
results = soup.find_all('tbody')
records = []  
for result in results:  
    state_name = result.find('td').text
    law_Name = result.find('a').text
    law_link = result.find('a').get('href')
    law_status = result.find('b').text
    law_descr = result.find('tr').text[16:-2]
    records.append((state_name, law_Name,law_link,law_status,law_descr))

Только один элемент заполняется в список записей, хотя я использую a для l oop до go через весь объект результатов (который является bs4.element.ResultSet):

[('Alabama',
  'SJR 40',
  'http://alisondb.legislature.state.al.us/ALISON/SearchableInstruments/2020RS/PrintFiles/SJR40-enr.pdf',
  'Eligible for Governor.',
  ' Urges individuals to fist bump rather than shake hands. Eligible for Governor')]

Любая помощь для исправления моего кода будет с благодарностью. Спасибо!

1 Ответ

4 голосов
/ 02 апреля 2020

В исходном коде есть один тег <tbody>, поэтому он создаст список из одного элемента. И когда вы попытаетесь найти td, это займет только первое найденное. Я думаю, что вам нужен список всех <tr> в tbody и для этого используйте soup.find_all('tbody')[0].find_all('tr') Кстати, позаботьтесь о структуре, некоторые ссылки не имеют <b>. Я думаю, что это может помочь вам:

import requests  
from bs4 import BeautifulSoup  

r = requests.get('https://www.ncsl.org/research/health/state-action-on-coronavirus-covid-19.aspx')
soup = BeautifulSoup(r.text, 'html.parser')  
results = soup.find_all('tbody')[0].find_all('tr')
records = []
for result in results:  
    state_name = result.find('td').text
    if result.find('a'):
        law_Name = result.find('a').text
        law_link = result.find('a').get('href')
    else:
        law_Name = None
        law_link = None
    law_status = result.find('b').text if result.find('b') else None
    law_descr = result.find_all('td')[1].text[16:-2]
    records.append((state_name, law_Name,law_link,law_status,law_descr))
...