В настоящее время мой код выглядит следующим образом:

 from bs4 import BeautifulSoup
 import requests

 main_url = 'http://www.foodnetwork.com/recipes/a-z'
 response = requests.get(main_url)
 soup = BeautifulSoup(response.text, "html.parser")
 mylist = [t for tags in soup.find_all(class_='m-PromoList o-Capsule__m-
           PromoList') for t in tags if (t!='\n')] 

На данный момент я получаю список, содержащий правильную информацию, но все еще внутри HTML-тегов. Пример элемента списка приведен ниже:

 <li class="m-PromoList__a-ListItem"><a href="//www.foodnetwork.com/recipes/ina-garten/16-bean-pasta-e-fagioli-3612570">"16 Bean" Pasta E Fagioli</a></li>

Из этого элемента я хочу извлечь как ссылку href, так и следующую строку отдельно, но у меня возникают проблемы с этим, и я действительно не думаю, что получение этой информации потребует совершенно нового набора операций. Как делать?

0
Fancypants753 3 Янв 2018 в 08:19

2 ответа

Лучший ответ

Вы можете сделать это, чтобы получить href и текст для одного элемента:

href = soup.find('li', attrs={'class':'m-PromoList__a-ListItem'}).find('a')['href']
text = soup.find('li', attrs={'class':'m-PromoList__a-ListItem'}).find('a').text

Для списка предметов:

my_list = soup.find_all('li', attrs={'class':'m-PromoList__a-ListItem'})
for el in my_list:
    href = el.find('a')['href']
    text = el.find('a').text
    print(href)
    print(text)

Изменить:
Важный совет по сокращению времени выполнения: Не ищите один и тот же тег более одного раза. Вместо этого сохраните тег в переменной, а затем используйте его несколько раз.

a = soup.find('li', attrs={'class':'m-PromoList__a-ListItem'}).find('a')
href = a.get('href')
text = a.text

В больших HTML-кодах поиск тега занимает много времени, поэтому это сократит время, необходимое для поиска тега, поскольку он будет запускаться только один раз.

0
Keyur Potdar 3 Янв 2018 в 08:06

Несколько способов добиться того же. Вот еще один подход с использованием css selector:

from bs4 import BeautifulSoup
import requests

response = requests.get('http://www.foodnetwork.com/recipes/a-z')
soup = BeautifulSoup(response.text, "lxml")
for item in soup.select(".m-PromoList__a-ListItem a"):
    print("Item_Title: {}\nItem_Link: {}\n".format(item.text,item['href']))

Частичный результат:

Item_Title: "16 Bean" Pasta E Fagioli
Item_Link: //www.foodnetwork.com/recipes/ina-garten/16-bean-pasta-e-fagioli-3612570

Item_Title: "16 Bean" Pasta e Fagioli
Item_Link: //www.foodnetwork.com/recipes/ina-garten/16-bean-pasta-e-fagioli-1-3753755

Item_Title: "21" Apple Pie
Item_Link: //www.foodnetwork.com/recipes/21-apple-pie-recipe-1925900
0
SIM 3 Янв 2018 в 11:07