Не удается избавиться от проблем с навигацией, вызванных BeautifulSoup

1

Я написал скрипт в 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']
[]
[]
Теги:
python-3.x
web-scraping
beautifulsoup

2 ответа

1
Лучший ответ

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

Вы можете изменить свой селектор 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']
  • 0
    Это не будет хорошей идеей, потому что вы имеете дело с частичной частью моего гигантского сценария, в котором есть несколько поисков, и лишь немногие результаты поиска могут не содержать это поле, поэтому я и избегал использовать «ID». Благодарю.
  • 0
    Затем отбросьте понимание списка и используйте цикл for вместо тех же условий. Оберните часть .get_text () (которая выдает ошибку - очевидно, не все элементы могут быть вызваны с .get_text ()) в блоке try / Кроме. И это должно сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню