0

次のように作成されたWebページから情報をスクレイピングしたい

...
<div class="foo">
    <span class="title">sometext</span>
    <ul class="infos">
        <li class="bar">
            <a class="link" href="...">link1</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link2</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link3</a>
            <img class="photo" src="..." />
        </li>
    </ul>

    <span class="title">sometext2</span>
    <ul class="infos">
        <li class="bar">
            <a class="link" href="...">link4</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link5</a>
            <img class="photo" src="..." />
        </li>
    </ul>

    and so on...

</div>
...

しかし、次のような単純なリストを取得するために、情報のすべてのグループを循環する方法がわかりません

sometext:
- link1   imgsrc
- link2   imgsrc
- link3   imgsrc

sometext2:
- link4   imgsrc
- link5   imgsrc
4

1 に答える 1

2

class を持つすべてのスパンを検索し、次の兄弟を検索して、その中の要素titleを反復処理します。li

from bs4 import BeautifulSoup as Soup

html = """
<div class="foo">
    <span class="title">sometext</span>
    <ul class="infos">
        <li class="bar">
            <a class="link" href="...">link1</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link2</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link3</a>
            <img class="photo" src="..." />
        </li>
    </ul>

    <span class="title">sometext2</span>
    <ul class="infos">
        <li class="bar">
            <a class="link" href="...">link4</a>
            <img class="photo" src="..." />
        </li>
        <li class="bar">
            <a class="link" href="...">link5</a>
            <img class="photo" src="..." />
        </li>
    </ul>
</div>
"""
soup = Soup(html)

for span in soup.find_all('span', {'class': 'title'}):
    print span.text
    for li in span.next_sibling.next_sibling.find_all('li', {'class': 'bar'}):
        print "- %s % s" % (li.find('a').text, li.find('img').attrs['src'])

プリント:

sometext
- link1 ...
- link2 ...
- link3 ...
sometext2
- link4 ...
- link5 ...
于 2013-09-06T10:10:01.880 に答える