#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)