#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