Извлечение определенного значения из таблицы с помощью Beautiful Soup (Python)

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Я посмотрел на Stackoverflow, и большинство руководств, похоже, очень специфичны для извлечения всех данных из таблицы. Однако мне нужно извлечь только одно, и, похоже, я просто не могу извлечь это конкретное значение из таблицы.

Очистить ссылку:

https://gis.vgsi.com/portsmouthnh/Parcel.aspx?pid=38919

Я хочу извлечь значение «Style» из таблицы в ссылке.

Код:

 import bs4

styleData=[]

pagedata = requests.get("https://gis.vgsi.com/portsmouthnh/Parcel.aspx?pid=38919") 
cleanpagedata = bs4.BeautifulSoup(pagedata.text, 'html.parser') 

table=cleanbyAddPD.find('div',{'id':'MainContent_ctl01_panView'})
style=table.findall('tr')[3]
style=style.findall('td')[1].text
print(style)
styleData.append(style)
 

Ответ №1:

Возможно, вы неправильно find_all использовали функцию, попробуйте это решение:

 style=table.find_all('tr')[3]
style=style.find_all('td')[1].text
print(style)
 

Это даст вам ожидаемый результат

Ответ №2:

Вы можете использовать селектор CSS:

#MainContent_ctl01_grdCns tr:nth-of-type(4) td:nth-of-type(2)

Который выберет "MainContent_ctl01_grdCns" id , четвертый <tr> , второй <td> .

Чтобы использовать селектор CSS, используйте .select() метод вместо find_all() . Или select_one() вместо find() .


 import requests
from bs4 import BeautifulSoup


URL = "https://gis.vgsi.com/portsmouthnh/Parcel.aspx?pid=38919"

soup = BeautifulSoup(requests.get(URL).content, "html.parser")
print(
    soup.select_one(
        "#MainContent_ctl01_grdCns tr:nth-of-type(4)  td:nth-of-type(2)"
    ).text
)
 

Вывод:

 Townhouse End
 

Ответ №3:

Также можно сделать что-то вроде:

 import bs4 
import requests
style_data = []
url = "https://gis.vgsi.com/portsmouthnh/Parcel.aspx?pid=38919"

soup = bs4.BeautifulSoup(requests.get(url).content, 'html.parser')
# select the first `td` tag whose text contains the substring `Style:`.
row = soup.select_one('td:-soup-contains("Style:")')
if row:
    # if that row was found get its sibling which should be that vlue you want
    home_style_tag = row.next_sibling
    style_data.append(home_style_tag.text)
 

Пара замечаний

  • При этом используются селекторы CSS, а не методы поиска. Более подробную информацию см. в документах SoupSieve.
  • select_one Полагается на тот факт, что таблица всегда упорядочена определенным образом, если это не так, используйте select и перебирайте результаты, чтобы найти текст bs4.Tag , который точно соответствует тексту 'Style:' , а затем возьмите его следующего собрата

Использование select :

 rows = soup.select('td:-soup-contains("Style:")')
row = [r for r in rows if r.text == 'Style:']
home_style_text = row.text
 

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

1. Итак, я попробовал это, но продолжал получать код ошибки «NotImplementedError» table=cleanbyAddPD.find(‘div’,{‘id’:’MainContent_ctl01_panView’}) style = cleanbyAddPD.select_one(‘td:-soup-contains(«Style:»)’) style=style .next_sibling печать (стиль) styleData.append(стиль)

2. Не уверен, как поместить это в легко просматриваемый блок кода

3. Пожалуйста, укажите полный текст ошибки. Я предполагаю, что в вашей версии нет -soup-contains псевдокласса, в документах упоминается, что он относительно новый. Старая версия :contains . Вот документы SoupSieve по этому вопросу

Ответ №4:

Вы можете использовать :contains on a td , чтобы получить узел со innerText «Стилем», а затем смежный комбинатор-аналог с td селектором типа, чтобы получить смежное td значение.

 import bs4, requests

pagedata = requests.get("https://gis.vgsi.com/portsmouthnh/Parcel.aspx?pid=38919") 
cleanpagedata = bs4.BeautifulSoup(pagedata.text, 'html.parser') 
print(cleanpagedata.select_one('td:contains("Style")   td').text)