Я написал скрипт в python
в сочетании с BeautifulSoup
для анализа определенного адреса с веб-страницы. Однако, когда я запускаю свой нижний скрипт, я получаю проблему AttributeError: 'NavigableString' object has no attribute 'text'
когда он попадает на address = [item.find_next_sibling().get_text(strip=True)
строки address = [item.find_next_sibling().get_text(strip=True)
. Я могу избавиться от этой проблемы, если попытаюсь прокомментировать строки. Однако я хотел бы придерживаться того, как это применяется в настоящее время. Что я могу сделать?
Это моя попытка:
import requests
from bs4 import BeautifulSoup
URL = "https://beta.companieshouse.gov.uk/officers/lX9snXUPL09h7ljtMYLdZU9LmOo/appointments"
def fetch_names(session,link):
session.headers = {"User-Agent":"Mozilla/5.0"}
res = session.get(link)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("#content-container dt"):
#the error appears in the following line
address = [item.find_next_sibling().get_text(strip=True) for item in items if "correspondence address" in item.text.lower()][0]
print(address)
if __name__ == '__main__':
with requests.Session() as session:
fetch_names(session,URL)
Я могу избавиться от ошибки, выполнив что-то вроде ниже, но я хочу придерживаться того, как я пытался в своем скрипте:
items = soup.select("#content-container dt")
address = [item.find_next_sibling().get_text(strip=True) for item in items if "correspondence address" in item.text.lower()][0]
print(address)
РЕДАКТИРОВАТЬ:
Это не ответ, но вот как я пытался поиграть (все еще не
.find_previous_sibling()
как применить.find_previous_sibling()
хотя:
import requests
from bs4 import BeautifulSoup
URL = "https://beta.companieshouse.gov.uk/officers/lX9snXUPL09h7ljtMYLdZU9LmOo/appointments"
def fetch_names(session,link):
session.headers = {"User-Agent":"Mozilla/5.0"}
res = session.get(link)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("#content-container dt"):
address = [item for item in items.strings if "correspondence address" in item.lower()]
print(address)
if __name__ == '__main__':
with requests.Session() as session:
fetch_names(session,URL)
И он производит (нет проблем с навигацией).
[]
['Correspondence address']
[]
[]
items
не являются списком узлов, а единственным узлом, поэтому вы не должны использовать его как итератор здесь - for item in items
. Просто замените понимание списка ниже:
for items in soup.select("#content-container dt"):
if "correspondence address" in items.text.lower():
address = items.find_next_sibling().get_text(strip=True)
print(address)
Вы можете изменить свой селектор BeautifulSoup, чтобы посмотреть адрес ID контактного адреса на # корреспонденции-адрес-значение-1.
import requests
from bs4 import BeautifulSoup
URL = "https://beta.companieshouse.gov.uk/officers/lX9snXUPL09h7ljtMYLdZU9LmOo/appointments"
def fetch_names(session,link):
session.headers = {"User-Agent":"Mozilla/5.0"}
res = session.get(link)
soup = BeautifulSoup(res.text,"lxml")
addresses = [a.text for a in soup.select("#correspondence-address-value-1")]
print(addresses)
if __name__ == '__main__':
with requests.Session() as session:
fetch_names(session,URL)
Результаты
13:32 $ python test.py
['21 Maes Y Llan, Conwy, Wales, LL32 8NB']