2016-02-23 3 views
1

Вечернего Folks,Прицепных данных/ссылки из поиска Google с помощью Beautiful Soup

Я пытаюсь задать вопрос Google, и тянуть все соответствующие ссылки из своего уважаемого поискового запроса (то есть я ищу «сайт: Википедию. ком Томас Джефферсон», и это дает мне wiki.com/jeff, wiki.com/tom и т.д.)

Вот мой код:

from bs4 import BeautifulSoup 
from urllib2 import urlopen 

query = 'Thomas Jefferson' 

query.replace (" ", "+") 
#replaces whitespace with a plus sign for Google compatibility purposes 

soup = BeautifulSoup(urlopen("https://www.google.com/?gws_rd=ssl#q=site:wikipedia.com+" + query), "html.parser") 
#creates soup and opens URL for Google. Begins search with site:wikipedia.com so only wikipedia 
#links show up. Uses html parser. 

for item in soup.find_all('h3', attrs={'class' : 'r'}): 
    print item.string 
#Guides BS to h3 class "r" where green Wikipedia URLs are located, then prints URLs 
#Limiter code to only pull top 5 results 

цель здесь для меня, чтобы установить запрос переменная, имеет запрос на python Google и Beautiful Soup pulls все «зеленые» ссылки, если хотите.

Here is a picture of a Google results page

Я только хочу, чтобы тянуть зеленые ссылки, в полном объеме. Странно, что исходный код Google «скрыт» (симптом их архитектуры поиска), поэтому Beautiful Soup не может просто пойти и вытащить href из тега h3. Я могу видеть h3 hrefs, когда я проверяю элемент, но не тогда, когда я просматриваю источник.

Here is a picture of the Inspect Element

Мой вопрос: Как я могу идти о потянув топ-5 наиболее соответствующие зеленые ссылки с Google через BeautifulSoup, если я не могу получить доступ к их исходным кодом, только Осмотреть элемент?

PS: Для того, чтобы дать представление о том, что я пытаюсь сделать, я нашел два относительно близко Переполнение стека вопросов, как у меня:

beautiful soup extract a href from google search

How to collect data of Google Search with beautiful soup using python

ответ

2

я получил другой URL, чем Роб М., когда я попытался найти с JavaScript инвалидов -

https://www.google.com/search?q=site:wikipedia.com+Thomas+Jefferson&gbv=1&sei=YwHNVpHLOYiWmQHk3K24Cw 

Чтобы сделать эту работу с любым запросом, вы должны сначала убедиться, что ваш запрос не имеет места в ней (поэтому вы получите 400: Bad Request). Вы можете сделать это с replace, как это:

query = "Thomas Jefferson" 
query = query.replace(' ', '+') 

который заменит все пробелы с знаками плюс - создание правильный URL. Обратите внимание, что вам нужно переназначить вывод метода замены на query - str.replace() не изменяет строку на месте, она возвращает копию строки с внесенными изменениями.

Однако, это делает не работу с URLLIB - вы получаете 403: Forbidden.Я получил его на работу, используя python-requests модуль так:

import requests 
from bs4 import BeautifulSoup 

query = 'Thomas Jefferson' 

query = query.replace (" ", "+") 
#replaces whitespace with a plus sign for Google compatibility purposes 

r = requests.get('https://www.google.com/search?q=site:wikipedia.com+{}&gbv=1&sei=YwHNVpHLOYiWmQHk3K24Cw'.format(query)) 
soup = BeautifulSoup(r.text, "html.parser") 
#creates soup and opens URL for Google. Begins search with site:wikipedia.com so only wikipedia 
#links show up. Uses html parser. 

links = [] 
for item in soup.find_all('h3', attrs={'class' : 'r'}): 
    links.append(item.a['href'][7:]) # [7:] strips the /url?q= prefix 
#Guides BS to h3 class "r" where green Wikipedia URLs are located, then prints URLs 
#Limiter code to only pull top 5 results 

Печать ссылок дает:

print links 
# [u'http://en.wikipedia.com/wiki/Thomas_Jefferson&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggUMAA&usg=AFQjCNG6INz_xj_-p7mpoirb4UqyfGxdWA', 
# u'http://www.wikipedia.com/wiki/Jefferson%25E2%2580%2593Hemings_controversy&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggeMAE&usg=AFQjCNEjCPY-HCdfHoIa60s2DwBU1ffSPg', 
# u'http://en.wikipedia.com/wiki/Sally_Hemings&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggjMAI&usg=AFQjCNGxy4i7AFsup0yPzw9xQq-wD9mtCw', 
# u'http://en.wikipedia.com/wiki/Monticello&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggoMAM&usg=AFQjCNE4YlDpcIUqJRGghuSC43TkG-917g', 
# u'http://en.wikipedia.com/wiki/Thomas_Jefferson_University&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggtMAQ&usg=AFQjCNEDuLjZwImk1G1OnNEnRhtJMvr44g', 
# u'http://www.wikipedia.com/wiki/Jane_Randolph_Jefferson&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFggyMAU&usg=AFQjCNHmXJMI0k4Bf6j3b7QdJffKk97tAw', 
# u'http://en.wikipedia.com/wiki/United_States_presidential_election,_1800&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFgg3MAY&usg=AFQjCNEqsc9jDsDetf0reFep9L9CnlorBA', 
# u'http://en.wikipedia.com/wiki/Isaac_Jefferson&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFgg8MAc&usg=AFQjCNHKAAgylhRjxbxEva5IvDA_UnVrTQ', 
# u'http://en.wikipedia.com/wiki/United_States_presidential_election,_1796&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFghBMAg&usg=AFQjCNHviErFQEKbDlcnDZrqmxGuiBG9XA', 
# u'http://en.wikipedia.com/wiki/United_States_presidential_election,_1804&sa=U&ved=0ahUKEwj4p5-4zI_LAhXCJCYKHUEMCjQQFghGMAk&usg=AFQjCNEJZSxCuXE_Dzm_kw3U7hYkH7OtlQ'] 
+0

Спасибо так много для отличного ответа! Я должен спросить, если бы я хотел назначить новую переменную каждой из ссылок, как бы я это сделал? x = wiki.com/tom, y = wiki.com/jeff и т. д. Еще раз большое спасибо за ответ! –

+0

Вы можете сохранить их все в списке вместо их печати или сохранить в словаре. – wpercy

+0

Я относительно новичок в Python, и я не совсем уверен, как это сделать, а тем более интегрировать его с выходным форматом BeautifulSoup. Вы не заметите меня в правильном направлении? И я принял ваш ответ :) –

0

Это не будет для работы с хеш-поиском (#q=site:wikipedia.com, как и у вас), поскольку он загружает данные через AJAX вместо того, чтобы служить вам полным анализируемым HTML-кодом с результатами, вы должны использовать это вместо:

soup = BeautifulSoup(urlopen("https://www.google.com/search?gbv=1&q=site:wikipedia.com+" + query), "html.parser") 

Для справки я отключил javascript и выполнил поиск по Google, чтобы получить эту структуру URL-адресов.

+0

Когда я делаю это я получаю 'HTTPError: Ошибка HTTP 400: Bad Request' –