2017-02-22 65 views
-1

Скрестив страницу и пытаясь получить все URL-адреса из первого столбца. Когда я называю текст, я получаю все в div, который я получаю. Но, когда я специально нацелен на URL, я получаю только первый. Как я могу получить все из них - разделенные для хранения?Почему python и BS4 возвращают только один 'href' при вызове специально, но все значения, когда вызывается как текст?

from bs4 import BeautifulSoup 
from urllib import urlopen 
base_url = "http://www.heavyliftpfi.com/news/" 
html = urlopen(base_url) 
soup = BeautifulSoup(html.read().decode('latin-1', 'ignore'),"lxml") 
main_div = soup.select_one("div.fullWidth") 
div_sub = main_div.select_one("div.leftcol") 
print (div_sub).text # I get that this gets everything as .text 
print (div_sub).h2.a['href'] # alternate - with only one 'href' return 

ответ

1

, так как вы навигация по дереву разбора через имена тегов, если у вас есть несколько соответствия имен, только первый из них возвращаемых атрибута. Это ожидаемое поведение. Попробуйте использовать find_all(), чтобы искать их вместо этого.

из BS4 документов:

«Использование имени тега в качестве атрибута даст вам только первый тег, этого имени.»

«Если вам нужно, чтобы получить все тег, или что-нибудь более сложное, чем первого тега с определенным именем, вы должны будете использовать один из методов, описанных в поисках дерева, такие как find_all () "

см: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#navigating-using-tag-names

0

Это был FindAll, но мне нужно, чтобы двигаться вверх по дереву

for a in main_div.findAll('a', href=True): 
    print a['href']