Возвращает табличную информацию на основе условия в Beautiful Soup / Python

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Я пытаюсь очистить эту страницу: https://www.nysenate.gov/legislation/bills/2019/s8450

Я хочу только извлекать информацию из таблицы (ту, которая появляется при нажатии кнопки «просмотреть действия») Если он содержит следующую строку: "Delivered To Governor" .

Я могу перебирать таблицу, но тогда у меня возникают проблемы при попытке удалить весь дополнительный текст тега.

 url = "https://www.nysenate.gov/legislation/bills/2019/s8450"
raw_html = requests.get(url).content
soup = BeautifulSoup(raw_html, "html.parser")

bill_life_cycle_table = soup.find("tbody")
bill_life_cycle_table
 

Ответ №1:

вы можете указать условие if, чтобы проверить, присутствует ли строка в ячейке, и найти предыдущее значение ячейки. Используйте селектор css select()

 from bs4 import BeautifulSoup
import requests

url = "https://www.nysenate.gov/legislation/bills/2019/s8450"
raw_html = requests.get(url).content
soup = BeautifulSoup(raw_html, "html.parser")
tablebody=soup.select_one(".table.c-bill--actions-table > tbody")
for item in tablebody.select("td"):
    if "delivered to governor" in item.text:
        print(item.find_previous("td").text)
 

Вывод на консоль:

 Dec 11, 2020
 

Комментарии:

1. Это помогло — большое вам спасибо! Если у вас есть время, не могли бы вы объяснить, как часть вашего кода «.table.c-bill—actions-table> tbody») блокируется в таблице? Я никогда не видел этого раньше (что мало о чем говорит, я довольно новичок в этом).

2. @Adam: я использовал css-селектор bs4, где .table.c-bill--actions-table есть classname таблицы и .table.c-bill--actions-table> tbody идентифицирует tbody элемент этой таблицы. Надеюсь, это поможет захватить один элемент select_one() и захватить несколько элементов select() .

Ответ №2:

Используйте bs4.element.Tag.text метод:

 from bs4 import BeautifulSoup
import requests
url = "https://www.nysenate.gov/legislation/bills/2019/s8450"
raw_html = requests.get(url).content
soup = BeautifulSoup(raw_html, "html.parser")
bill_life_cycle_table = soup.find("tbody")
print(bill_life_cycle_table.text)
 

Вывод:

 
Dec 11, 2020
delivered to governor

Jul 23, 2020
returned to assemblypassed senate3rd reading cal.908substituted for s8450c

Jul 23, 2020
substituted by a10500c

Jul 22, 2020
ordered to third reading cal.908

Jul 20, 2020
reported and committed to rules

Jul 18, 2020
print number 8450c

Jul 18, 2020
amend and recommit to health

Jul 09, 2020
print number 8450b

Jul 09, 2020
amend and recommit to health

Jun 05, 2020
print number 8450a

Jun 05, 2020
amend and recommit to health

Jun 03, 2020
referred to health 

 

Обновить:

Для условия даты печати:

 from bs4 import BeautifulSoup
import requests
url = "https://www.nysenate.gov/legislation/bills/2019/s8450"
raw_html = requests.get(url).content
soup = BeautifulSoup(raw_html, "html.parser")
bill_life_cycle_table = soup.find("tbody").text.splitlines()
for a, b in zip(bill_life_cycle_table, bill_life_cycle_table[1:]):
    if b.title() == "Delivered To Governor":
        print(a)
 

Вывод:

 Dec 11, 2020
 

Комментарии:

1. Спасибо, теперь как написать условие, которое возвращает только дату, если оно содержит текст «доставлено губернатору»?

2. @Adam обновлено. —

Ответ №3:

Вы можете прочитать в <table> теге с pandas помощью ‘ (он использует BeautifulSoup под капотом). затем фильтруйте по столбцу и возвращайте дату.

Код:

 import pandas as pd

url = "https://www.nysenate.gov/legislation/bills/2019/s8450"
df = pd.read_html(url)[0]

date = df[df.iloc[:,-1] == 'delivered to governor'].iloc[0,0]
 

Вывод:

 print (date)
Dec 11, 2020