Уведомления

Группа в Telegram: @pythonsu

#1 Июль 20, 2012 17:12:58

webstghost
Зарегистрирован: 2012-06-02
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с регуляркой

Регулярка должна собирать ссылки залинкованные с картинок.

rex = re.compile(r'(href=(\"|\'|\.\.)([^>]*?)(\"|\'|(class=))(.*?)><img)', re.S)
        urls = [c[2] for c in rex.findall(s)]
В таком случае:
        <tr>
            <td valign="top" class="class">
            <a href="http://www.domain.com/url1" target="_new" rel="nofollow"><img style="border: 1px solid #000000;" name="name" id="id" src="http://domain.com/1.jpg" width="400" height="500" /></a>
            </td>
            <td valign="top" class="class">
            <span class="title">title</span><br>
            text<span class="new">text</span> <br>
            <br>
            <a href="http://www.domain.com/url2" class="class"  title="title">title</a>, <a href="http://www.domain.com/url3" class="class"  title="title">title</a>  <br><br>
            </td>
регулярка собирает "http://www.domain.com/url2“ а не ”http://www.domain.com/url1"…

Офлайн

#2 Июль 20, 2012 17:55:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите с регуляркой

r"""href=["'](.*?)["'].*?<img"""

Но парсить HTML регулярками - плохая затея

Лучше XPath. На lxml будет так:
import lxml.html
 
doc = lxml.html.fromstring(html)
print doc.xpath('//img/parent::a/@href')  #['http://www.domain.com/url1']

Отредактировано reclosedev (Июль 20, 2012 17:57:26)

Офлайн

#3 Июль 20, 2012 23:13:54

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

помогите с регуляркой

reclosedev
плохая затея
А где там написано, почему именно это плохая идея? Первый пост - поток сознания и прямого ответа на вопрос не дает. Ниже написано, что PCRE по Хомскому вообще требуют машину Тьюринга.

Офлайн

#4 Авг. 19, 2012 13:47:39

webstghost
Зарегистрирован: 2012-06-02
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с регуляркой

А в вариаете с lxml реально собирать только локальные ссылки игнорируя все что ведет на внешние домены и исключая ссылки с выбранной последовательностью символов в теле?
Например есть сайт domain.com. На нем с картинок залинвованы ссылки:
http://domain.com/taramparam.html
http://domain1.com/taramparam.html
http://domain.com/taramparam_вредноеслово.html
Нам нужна только "http://domain.com/taramparam.html".

Офлайн

#5 Авг. 19, 2012 15:16:47

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите с регуляркой

webstghost
А в вариаете с lxml реально собирать только локальные ссылки игнорируя все что ведет на внешние домены и исключая ссылки с выбранной последовательностью символов в теле?
Например есть сайт domain.com. На нем с картинок залинвованы ссылки:
http://domain.com/taramparam.html
http://domain1.com/taramparam.html
http://domain.com/taramparam_вредноеслово.html
Нам нужна только "http://domain.com/taramparam.html".

Можно:
html = """<tr>
<td valign="top" class="class">
<a href="http://www.domain.com/url1" target="_new" rel="nofollow"><img style="border: 1px solid #000000;" name="name" id="id" src="http://domain.com/1.jpg" width="400" height="500" /></a>
<a href="http://www.domain1.com/bad_url1" target="_new" rel="nofollow"><img style="border: 1px solid #000000;" name="name" id="id" src="http://domain.com/1.jpg" width="400" height="500" /></a>
<a href="/url2" target="_new" rel="nofollow"><img style="border: 1px solid #000000;" name="name" id="id" src="http://domain.com/1.jpg" width="400" height="500" /></a>
<a href="/bad_url_stopword" target="_new" rel="nofollow"><img style="border: 1px solid #000000;" name="name" id="id" src="http://domain.com/1.jpg" width="400" height="500" /></a>
</td>
<td valign="top" class="class">
<span class="title">title</span><br>
text<span class="new">text</span> <br>
<br>
<a href="http://www.domain.com/url2" class="class"  title="title">title</a>, <a href="http://www.domain.com/url3" class="class"  title="title">title</a>  <br><br>
</td>"""
import lxml.html
 
doc = lxml.html.fromstring(html)
print doc.xpath('//img/parent::a[not(contains(@href, "stopword")) and starts-with(@href, "/") or starts-with(@href, "http://www.domain.com") ]/@href')
Но если дерево большое или условий много, то быстрее и проще фильтровать средствами Питона.

Офлайн

#6 Авг. 20, 2012 22:32:33

webstghost
Зарегистрирован: 2012-06-02
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с регуляркой

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

Офлайн

#7 Авг. 21, 2012 11:52:54

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите с регуляркой

webstghost
Как сделать список заблокированных слов?
Вручную в Питоне пробегаясь по списку. Или regexp-ом типа (first|second|third).

Кстати, в XPath тоже можно regexp использовать:
print doc.xpath('//img/parent::a[not(re:match(@href, "(first|second|third)"))'
                ' and starts-with(@href, "/")'
                ' or starts-with(@href, "http://www.domain.com")]/@href',
                namespaces={"re": "http://exslt.org/regular-expressions"})

Отредактировано reclosedev (Авг. 21, 2012 11:53:42)

Офлайн

#8 Авг. 21, 2012 14:55:23

webstghost
Зарегистрирован: 2012-06-02
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с регуляркой

Еще такой вопрос. Есть html:

         <a href="/url/url.html">
	<span class="image"><img src="http://host_ip/img.jpg" alt="text"></span>
	<span class="text">text</span>
	<span class="class1">class1</span>
	<span class="class2">class2</span>
</a>
xpath отказывается парсить ссылку с такого куска кода. Что ему может не нравиться?

Офлайн

#9 Авг. 21, 2012 16:27:02

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите с регуляркой

Потому что там выбираются родители img, а тут еще span.
Нужно заменить:

'//img/parent::a' на '//a[descendant::img]'
Т.е. выбираем все а, в потомках у которых есть img.

http://ru.wikipedia.org/wiki/XPath

Отредактировано reclosedev (Авг. 21, 2012 16:27:33)

Офлайн

#10 Окт. 19, 2012 02:21:46

webstghost
Зарегистрирован: 2012-06-02
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с регуляркой

reclosedev
Потому что там выбираются родители img, а тут еще span.
Нужно заменить:
'//img/parent::a' на '//a[descendant::img]'
Т.е. выбираем все а, в потомках у которых есть img.

http://ru.wikipedia.org/wiki/XPath

Апну топик. Не могу понять в чем загвоздка при таком html:

<li>
<a href="/url/url1.html" />
<img src="http://ip_address/1.jpg" width="100" height="100" border=0 alt="title" /></a>
<h3>title</h3>
<div class="class"><i>class:</i> <a href="/url2/">url2</a>, <a href="url3">url3</a>, <a href="url4">url4</a>, <a href="url5">url5</a></div>
</li>

Не собирает “/url/url1.html”.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version