Как избежать ошибки 'NavigableString' с BeautifulSoup и получить текст href? - PullRequest
1 голос
/ 10 ноября 2019

Это то, что у меня есть:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

url = "http://python.beispiel.programmierenlernen.io/index.php"
doc = requests.get(url).content
soup = BeautifulSoup(doc, "html.parser")

for i in soup.find("div", {"class":"navigation"}):
    print(i)

В настоящее время вывод "i" выводится на печать:

<a class="btn btn-primary" href="index.php?page=2">Zur nächsten Seite!</a>

Я хочу распечатать ссылку href "index.php? страница = 2" . Когда я пытаюсь использовать BeautifulSoups «найти», «выбрать» или «attrs» метод на «я», я получаю ошибку. Например, с

print(i.attrs["href"])

я получаю:

AttributeError: 'NavigableString' object has no attribute 'attrs'

Как избежать ошибки 'NavigableString' с BeautifulSoup и получить текст href?

1 Ответ

2 голосов
/ 10 ноября 2019

Кажется, проблема for i in soup.find. Если вы ищете только один элемент, нет необходимости повторять этот элемент, и если вы ищете несколько элементов, find_all вместо find, вероятно, будет соответствовать цели.

Конкретнее, вот два подхода. Помимо того, что было упомянуто выше, обратите внимание, что i - это div, который содержит желаемый a в качестве дочернего элемента, поэтому нам необходим дополнительный шаг для его достижения (это может быть более прямым с помощью xpath).

import requests
from bs4 import BeautifulSoup

url = "http://python.beispiel.programmierenlernen.io/index.php"
doc = requests.get(url).content
soup = BeautifulSoup(doc, "html.parser")

for i in soup.find_all("div", {"class": "navigation"}):
    print(i.find("a", href=True)["href"])

print(soup.find("div", {"class": "navigation"})
          .find("a", href=True)["href"])

Вывод:

index.php?page=2
index.php?page=2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...