Python 3, красивый суп, получите следующий тег

У меня есть следующая html-часть, которая повторяется несколько раз с другими ссылками href:

<div class="product-list-item  margin-bottom">
<a title="titleexample" href="http://www.urlexample.com/example_1" data-style-id="sp_2866">

Теперь я хочу получить все ссылки href в этом документе, которые находятся непосредственно после тега div с классом «product-list-item». Довольно новичок в beautifulsoup, и ничего из того, что я придумал, не сработало.

Спасибо за идеи.

РЕДАКТИРОВАТЬ: На самом деле не обязательно быть beautifulsoup; когда это можно сделать с помощью регулярного выражения и парсера html python, это тоже нормально.

EDIT2: Что я пробовал (я новичок в python, поэтому то, что я сделал, может быть совершенно глупым с продвинутой точки зрения):

soup = bs4.BeautifulSoup(htmlsource)
x = soup.find_all("div")
for i in range(len(x)):
    if x[i].get("class") and "product-list-item" in x[i].get("class"):
        print(x[i].get("class"))

Это даст мне список всех «товар-список-элемент», но затем я попробовал что-то вроде

print(x[i].get("class").next_element)

Потому что я думал, что next_element или next_sibling должен дать мне следующий тег, но это просто приводит к AttributeError: объект 'list' не имеет атрибута 'next_element'. Поэтому я попробовал использовать только первый элемент списка:

print(x[i][0].get("class").next_element)

Что привело к этой ошибке: return self.attrs [key] KeyError: 0. Также пробовал с .find_all ("href") и .get ("href"), но все это приводит к тем же ошибкам.

EDIT3: Хорошо, кажется, я узнал, как это решить, теперь я сделал:

x = soup.find_all("div")

for i in range(len(x)):    
    if x[i].get("class") and "product-list-item" in x[i].get("class"):
        print(x[i].next_element.next_element.get("href"))

Это также можно сократить, используя другой атрибут функции find_all:

x = soup.find_all("div", "product-list-item")
for i in x:
    print(i.next_element.next_element.get("href"))

Приветствую


person user136036    schedule 31.05.2013    source источник
comment
вы можете показать нам, что вы пробовали? Спасибо   -  person Drewdin    schedule 31.05.2013


Ответы (1)


Я хочу получить все ссылки href в этом документе, которые находятся непосредственно после тега div с классом "product-list-item"

Чтобы найти первый элемент <a href> в <div>:

links = []
for div in soup.find_all('div', 'product-list-item'): 
    a = div.find('a', href=True) # find <a> anywhere in <div>
    if a is not None:
       links.append(a['href'])

Предполагается, что ссылка находится внутри <div>. Любые элементы в <div> до первого <a href> игнорируются.

Если хочешь; вы можете быть более строгими, например, взяв ссылку, только если это первый дочерний элемент в <div>:

a = div.contents[0] # take the very first child even if it is not a Tag
if a.name == 'a' and a.has_attr('href'):
   links.append(a['href'])

Или, если <a> не находится внутри <div>:

a = div.find_next('a', href=True) # find <a> that appears after <div>
if a is not None:
   links.append(a['href'])

Существует много способов поиска и навигации в BeautifulSoup.

Если вы выполняете поиск с помощью lxml.html, вы также можете использовать выражения xpath и css, если вы с ними знакомы.

person jfs    schedule 31.05.2013