Значение атрибута parse href от элемента с помощью Beautifulsoup и Mechanize

61
8

Может ли кто-нибудь помочь мне пройти дерево html с красивым супом?

Я пытаюсь разобрать через вывод html и после сбора каждого значения вставить в таблицу с именем Tld с python/django

<div class="rc" data-hveid="53">
<h3 class="r">
<a href="https://billing.anapp.com/" onmousedown="return rwt(this,'','','','2','AFQjCNGqpb38ftdxRdYvKwOsUv5EOJAlpQ','m3fly0i1VLOK9NJkV55hAQ','0CDYQFjAB','','',event)">Billing: Portal Home</a>
</h3>

И только разобрать значение атрибута href <a>, так что только эта часть:

https://billing.anapp.com/

из:

<a href="https://billing.anapp.com/" onmousedown="return rwt(this,'','','','2','AFQjCNGqpb38ftdxRdYvKwOsUv5EOJAlpQ','m3fly0i1VLOK9NJkV55hAQ','0CDYQFjAB','','',event)">Billing: Portal Home</a>

В настоящее время у меня есть:

for url in urls:
mb.open(url)
beautifulSoupObj = BeautifulSoup(mb.response().read())
beautifulSoupObj.find_all('h3',attrs={'class': 'r'})

Проблема заключается в том, что find_all выше, не делает это достаточно далеко для элемента <a>.

Буду признателен за любую оказанную помощь. Спасибо.

спросил(а) 2013-11-14T19:35:00+04:00 7 лет, 3 месяца назад
1
Решение
85

from bs4 import BeautifulSoup

html = """
<div class="rc" data-hveid="53">
<h3 class="r">
<a href="https://billing.anapp.com/" onmousedown="return rwt(this,'','','','2','AFQjCNGqpb38ftdxRdYvKwOsUv5EOJAlpQ','m3fly0i1VLOK9NJkV55hAQ','0CDYQFjAB','','',event)">Billing: Portal Home</a>
</h3>
"""

bs = BeautifulSoup(html)
elms = bs.select("h3.r a")
for i in elms:
print(i.attrs["href"])

печатает:

https://billing.anapp.com/

h3.ra - селектор css

вы можете использовать css-селектор (я их предпочитаю), xpath или найти в элементах. селектор h3.ra будет искать все h3 с классом r и получить изнутри элементы a. это может быть более сложный пример, например, #an_id table tr.the_tr_class td.the_td_class он найдет идентификатор, указанный td внутри, который принадлежит tr с данным классом и находится внутри таблицы, конечно.

это также даст вам тот же результат. find_all возвращает список bs4.element.Tag, find_all имеет рекурсивное поле, не уверенное, если вы можете сделать это в одной строке, я предпочитаю селектор css, потому что он прост и чист.

for elm in  bs.find_all('h3',attrs={'class': 'r'}):
for a_elm in elm.find_all("a"):
print(a_elm.attrs["href"])

ответил(а) 2013-11-14T19:43:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема