Как отфильтровать ссылки URL с критериями с помощью Beautifulsoup? Является ли это возможным? Да, в самом деле - PullRequest
2 голосов
/ 25 апреля 2019

На любом форуме всегда есть новые сообщения. Тот, который я посетил, дает «новую» наклейку на почту. Как я могу фильтровать и получать URL с новыми стикерами? Tricky ...

Я обычно только что схватил первую страницу. Но это кажется непрофессиональным. На самом деле в каждом разделе есть также стикеры с автором и датой. Могут ли они быть критериями фильтрации через BeautifulSoup? Я чувствую так много, чтобы учиться.

Это DOM:

<!-- 三級置頂分開 -->
<tbody id="stickthread_10432064">
<tr>
<td class="folder"><a href="thread-10432064-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
<td class="icon">
                                                                    </td>
<th class="new">
<label>
<img alt="" src="images/green001/agree.gif"/>
<img alt="本版置顶" src="images/green001/pin_1.gif"/>
                                                             </label>
<em>[<a href="forumdisplay.php?fid=230&amp;filter=type&amp;typeid=1215">痴女</a>]</em> <span id="thread_10432064"><a href="thread-10432064-1-1.html" style="font-weight: bold;color: blue">(セレブの友)(CESD-???)大槻ひびき</a></span>
<img alt="附件" class="attach" src="images/attachicons/common.gif"/>
<span class="threadpages"> <img src="images/new2.gif"/></span>  ### new sticker
</th>
<td class="author"> ### author sticker
<cite>
<a href="space.php?action=viewpro&amp;uid=12737809">新片</a><img align="absmiddle" border="0" src="images/thankyou.gif"/>12                                       </cite>
<em>2019-4-23</em> ### date sticker
</td>
<td class="nums"><strong>6</strong> / <em>14398</em></td>
<td class="nums">7.29G / MP4                
                </td>
<td class="lastpost">
<em><a href="redirect.php?tid=10432064&amp;goto=lastpost#lastpost">2019-4-25 14:11</a></em>
<cite>by <a href="space.php?action=viewpro&amp;username=22811">22811</a></cite>
</td>
</tr>
</tbody><!-- 三級置頂分開 -->

Скажем так, похоже, я недостаточно хорошо выразился. Я хочу сказать следующее: например, я хочу найти все «tbody» либо с «автором» из of, либо с «датой» из 2019-4-23, либо с наклейкой под названием «images / new2.gif». Я бы получил списки tbodys предположительно, а затем я хочу найти в них ссылку через

blue = soup.find_all('a', style="font-weight: bold;color: blue")

Спасибо, начальники!

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Есть класс new, поэтому мне интересно, не могли бы вы просто использовать это? Это было бы:

items = soup.select('tbody:has(.new)')
for item in items:
    print([i['href'] for i in item.select('a')])

В противном случае, вы можете использовать :has и :contains псевдоклассы (bs4 4.7.1) для определения этих шаблонов

items = soup.select('tbody:has(.author a:contains("新片")), tbody:has(em:contains("2019-4-23")), tbody:has([src="images/new2.gif"])')

Затем вы можете получить hrefs с помощью цикла

for item in items:
    print([i['href'] for i in item.select('a')])
0 голосов
/ 25 апреля 2019

Сначала вам нужно найти родительский тег, а затем найти следующего родного брата, а затем найти соответствующий тег. Надеюсь, вы получите код answer.try ниже.

from bs4 import BeautifulSoup
import re
data='''<tbody id="stickthread_10432064">
<tr>
<td class="folder"><a href="thread-10432064-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
<td class="icon">
                                                                    </td>
<th class="new">
<label>
<img alt="" src="images/green001/agree.gif"/>
<img alt="本版置顶" src="images/green001/pin_1.gif"/>
                                                             </label>
<em>[<a href="forumdisplay.php?fid=230&amp;filter=type&amp;typeid=1215">痴女</a>]</em> <span id="thread_10432064"><a href="thread-10432064-1-1.html" style="font-weight: bold;color: blue">(セレブの友)(CESD-???)大槻ひびき</a></span>
<img alt="附件" class="attach" src="images/attachicons/common.gif"/>
<span class="threadpages"> <img src="images/new2.gif"/></span>  ### new sticker
</th>
<td class="author"> ### author sticker
<cite>
<a href="space.php?action=viewpro&amp;uid=12737809">新片</a><img align="absmiddle" border="0" src="images/thankyou.gif"/>12                                       </cite>
<em>2019-4-23</em> ### date sticker
</td>
<td class="nums"><strong>6</strong> / <em>14398</em></td>
<td class="nums">7.29G / MP4                
                </td>
<td class="lastpost">
<em><a href="redirect.php?tid=10432064&amp;goto=lastpost#lastpost">2019-4-25 14:11</a></em>
<cite>by <a href="space.php?action=viewpro&amp;username=22811">22811</a></cite>
</td>
</tr>
</tbody>'''

soup=BeautifulSoup(data,'html.parser')
for item in soup.find_all('img',src=re.compile('images/new')):
    parent=item.parent.parent
    print(parent.find_next_siblings('td')[0].find('a').text)
    print(parent.find_next_siblings('td')[0].find('em').text)
...