Как я могу получить информацию из тега <a href> в тегах <div>с BeautifulSoup и Python? - PullRequest
7 голосов
/ 18 декабря 2011

все. У меня есть быстрый вопрос о BeautifulSoup с Python. У меня есть несколько фрагментов HTML, которые выглядят следующим образом (единственными отличиями являются ссылки и названия продуктов), и я пытаюсь получить ссылку из атрибута "href".

<div id="productListing1" xmlns:dew="urn:Microsoft.Search.Response.Document">
<span id="rank" style="display:none;">94.36</span>
<div class="productPhoto">
    <img src="/assets/images/ocpimages/87684/00131cl.gif" height="82" width="82" />
</div>
<div class="productName">
    <a class="on" href="/Products/ProductInfoDisplay.aspx?SiteId=1&amp;Product=8768400131">CAPRI SUN - JUICE DRINK - COOLERS VARIETY PACK 6 OZ</a>
</div>
<div class="size">40 CT</div>

У меня сейчас есть этот код Python:

productLinks = soup.findAll('a', attrs={'class' : 'on'})
for link in productLinks:
    print link['href']

Это работает (для каждой ссылки на странице я получаю что-то вроде /Products/ProductInfoDisplay.aspx?SiteId=1&amp;Product=8768400131); Тем не менее, я пытался выяснить, есть ли способ получить ссылку в атрибуте "href" без явного поиска "class =" on "". Я думаю, мой первый вопрос должен быть о том, является ли это лучшим способом найти эту информацию (class = "on" кажется слишком общим и может сломаться в будущем, хотя мои навыки CSS и HTML не так уж хороши). Я пробовал многочисленные комбинации методов find, findAll, findAllnext и т. Д., Но не могу заставить его работать. Это в основном то, что у меня было (я переставлял и менял это много раз):

productLinks = soup.find('div', attrs={'class' : 'productName'}).find('a', href=True)

Если это не очень хороший способ сделать это, как я могу получить тег <a> из тега <div class="productName">? Дайте мне знать, если вам нужна дополнительная информация.

Спасибо.

Ответы [ 2 ]

14 голосов
/ 18 декабря 2011

Что ж, когда у вас есть элемент <div>, вы можете получить подэлемент <a>, вызвав find():

productDivs = soup.findAll('div', attrs={'class' : 'productName'})
for div in productDivs:
    print div.find('a')['href']

Однако, поскольку <a> находится сразу над <div>, вы можете получить атрибут a из div:

productDivs = soup.findAll('div', attrs={'class' : 'productName'})
for div in productDivs:
    print div.a['href']

Теперь, если вы хотите поместить все элементы <a> в список, ваш код выше не будет работать, потому что find()просто возвращает один элемент, соответствующий его критериям.Вы получите список элементов div и получите от них подэлементы, например, используя списочные выражения:

productLinks = [div.a for div in 
        soup.findAll('div', attrs={'class' : 'productName'})]
for link in productLinks:
    print link['href']
4 голосов
/ 22 июля 2017

Я даю это решение в BeautifulSoup4

for data in soup.find_all('div', class_='productName'):
    for a in data.find_all('a'):
        print(a.get('href')) #for getting link
        print(a.text) #for getting text between the link
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...