Строка нарезки Python запрос веб-ссылка - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь получить ссылки с веб-страницы, используя скрипт Python.Но я получаю сообщение об ошибке:

, если ссылки [0: 4] == '/ wiki' и ссылки! = '#': TypeError: объект NoneType не может быть подписан.

Можете ли вы помочь?

from bs4 import BeautifulSoup
import requests
my_url = ('https://en.wikipedia.org/wiki/Kashmir')
response = requests.get(my_url)
page_soup = BeautifulSoup(response.content, "html.parser")
for link in page_soup.find_all('a'):
links = link.get('href')
if links[0:4] == '/wiki' and links != '#':
    print("https://en.wikipedia.org/wiki" + links)

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Вам нужен только селектор атрибутов с запусками с оператором

[href^='/wiki']

При использовании select вы получите пустой список, если совпадений нет.

То есть

links = ['https://en.wikipedia.org/wiki' + item['href'] for item in soup.select("[href^='/wiki']")]
0 голосов
/ 19 мая 2019

Ваш первый элемент в цикле следующий: <a id="top"></a>.Этот тег не имеет атрибута href и используется исключительно как якорь для ссылок «возврат на верх страницы».Когда вы звоните links = link.get('href'), результат равен links = None.Возникает исключение, когда вы пытаетесь вызвать None[0:4].

. Для отладки просто напечатайте значение переменной непосредственно перед тем, как произойдет ошибка, и должно быть ясно, что links не то, что вы ожидали.

Исправив это, есть ошибка в срезе.Из строки извлекаются только первые 4 символа, а не 5, поэтому он всегда будет ложным.Используйте href[0:5] или href[:5] для извлечения первых 5 символов (правая конечная точка является исключительной).На мой взгляд, использование string.startswith(substr) является более семантически точным, чем нарезка.Наконец, последний тест в условном links != "#" является избыточным и может быть опущен.Если это правда, что строка начинается с "/wiki", нет шансов, что она также будет равна "#".

Вот обновленная версия, которая проверяет, что links правдива, прежде чем пытаться нарезать ее.Обратите внимание, что я обновил несколько имен переменных, чтобы улучшить семантическую точность, добавил вертикальный интервал и удалил лишние скобки вокруг строки.

from bs4 import BeautifulSoup
import requests

url = "https://en.wikipedia.org/wiki/Kashmir"
response = requests.get(url)
page_soup = BeautifulSoup(response.content, "html.parser")

for link in page_soup.find_all('a'):
    href = link.get('href')

    if href and href.startswith('/wiki'):
         print("https://en.wikipedia.org/wiki" + href)

Выходной отрывок (всего 1103 ссылки):

...
https://en.wikipedia.org/wiki/wiki/Line_of_Control
https://en.wikipedia.org/wiki/wiki/Tourism_in_Jammu_and_Kashmir
https://en.wikipedia.org/wiki/wiki/United_Nations_Military_Observer_Group_in_India_and_Pakistan
https://en.wikipedia.org/wiki/wiki/Indian_Armed_Forces_and_the_Jammu_and_Kashmir_Floods,_2014
https://en.wikipedia.org/wiki/wiki/Peacebuilding_in_Jammu_and_Kashmir
https://en.wikipedia.org/wiki/wiki/Human_rights_abuses_in_Jammu_and_Kashmir
https://en.wikipedia.org/wiki/wiki/Crowd_control_in_Jammu_and_Kashmir
https://en.wikipedia.org/wiki/wiki/Women%27s_rights_in_Jammu_and_Kashmir
https://en.wikipedia.org/wiki/wiki/Template:Territorial_disputes_in_East,_South,_and_Southeast_Asia
https://en.wikipedia.org/wiki/wiki/Template_talk:Territorial_disputes_in_East,_South,_and_Southeast_Asia
https://en.wikipedia.org/wiki/wiki/Bhutanese_enclaves
https://en.wikipedia.org/wiki/wiki/Bhutan
https://en.wikipedia.org/wiki/wiki/China
https://en.wikipedia.org/wiki/wiki/Taiwan
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...