Найти - Пользователи
Полная версия: помогите с регуляркой
Начало » Python для новичков » помогите с регуляркой
1 2
webstghost
Регулярка должна собирать ссылки залинкованные с картинок.
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"…
reclosedev
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']
odnochlen
reclosedev
плохая затея
А где там написано, почему именно это плохая идея? Первый пост - поток сознания и прямого ответа на вопрос не дает. Ниже написано, что PCRE по Хомскому вообще требуют машину Тьюринга.
webstghost
А в вариаете с lxml реально собирать только локальные ссылки игнорируя все что ведет на внешние домены и исключая ссылки с выбранной последовательностью символов в теле?
Например есть сайт domain.com. На нем с картинок залинвованы ссылки:
http://domain.com/taramparam.html
http://domain1.com/taramparam.html
http://domain.com/taramparam_вредноеслово.html
Нам нужна только "http://domain.com/taramparam.html".
reclosedev
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')
Но если дерево большое или условий много, то быстрее и проще фильтровать средствами Питона.
webstghost
Как сделать список заблокированных слов?
reclosedev
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"})
webstghost
Еще такой вопрос. Есть 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 отказывается парсить ссылку с такого куска кода. Что ему может не нравиться?
reclosedev
Потому что там выбираются родители img, а тут еще span.
Нужно заменить:
'//img/parent::a' на '//a[descendant::img]'
Т.е. выбираем все а, в потомках у которых есть img.

http://ru.wikipedia.org/wiki/XPath
webstghost
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”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB