LINUX.ORG.RU

Как получить ссылки из определённых блоков html?

 


0

1

Есть html страница внутри которой есть блоки вида:

<h3>
<a href="/foo/">Категория</a>
→
<a href="/foo/bar">Полезная ссылка 1</a>
<span class="post_mark"> </span>
</h3>

Я хочу выдрать все полезные ссылки и сформировать из них список. То есть взять каждую вторую ссылку внутри h3 и получить это:

/foo/bar1
/foo/bar2
/foo/bar3

Что лучше для этого использовать из стандартных утилит?

Как реализовать условие «внутри h3»? Насколько я знаю, ленивые регулярные выражения вида <h3>.+?</h3> в, например, sed и awk не работают.



Последнее исправление: ksevelyar (всего исправлений: 2)

Парсером же. Ищи либы к своему языку. Регулярками парсить HTML это сильно, уже поясняли.

jessey
()
Ответ на: комментарий от jessey

Смотря какие задачи, тот же js поддерживает ленивые регулярки и с помощью него что-то простое можно делать без всяких либ.

Я хочу решить задачу системными утилитами, чтобы не ставить ничего дополнительно. Да и нету у меня «своего языка».

Это невозможно? Если да, то попробую модный и красивый Руби.

ksevelyar
() автор топика
Ответ на: комментарий от ksevelyar

Я хочу решить задачу системными утилитами

Только сейчас увидел =/ Не знаю, не сталкивался.

jessey
()
Ответ на: комментарий от ksevelyar

Для питона, для руби, для чего-то там еще. Я вчера ради интереса запилил с помощью daemons+mechanize+notify оповещалку на руби об уведомлениях здесь. Приятная штука. Правда, я ею серьезно не пользовался:)

cdshines ★★★★★
()

А что определяет «полезную ссылку»? Адрес вида /foo/barN ? По нему тогда и ищи. Или тот факт что она идёт перед span.post_mark? Тогда ...нутыпонил.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Попробую sed -n '/post_mark/{g;1!p;};h' , спасибо.

ksevelyar
() автор топика

Порекомендую все же обратить внимание на BeautifulSoup.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
from BeautifulSoup import BeautifulSoup as Soup

page = urllib.urlopen("http://example.com/page.html") # здесь вставить нужный урл
soup = BeautifulSoup(page.read())

h3 = soup.find('h3') # ищем тег h3
links = h3.findAll('a') # в найденном теге(h3), ищем все ссылки (т.е. теги a).

for link in links:
    print link.get('href') # печатаем ссылки (параметр "href" у каждого тега)

Два замечания:
1) BeautifulSoup все же придется установить в систему: $ sudo easy_install BeautifulSoup
2) Если в документе не один тег h3 или же нужный тег-h3 не первый в документе, то скрипт придется слегка поменять

p.s. движок лора что-то глючит, выбирает неверную разметку.

beka
()
Ответ на: комментарий от beka

Ух-ты, выглядит удобно, спасибо за наводку. По крайней мере вроде не хуже lxml.html, а сахара больше.

Kalashnikov ★★★
()

XPath из пайтона или перла никак? Есть и просто утилиты для cli

Orlangoor ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.