【问题标题】:Python: Extract links in certain class' classPython:提取某些类中的链接
【发布时间】:2018-04-01 06:18:54
【问题描述】:

HTML:

            <li class="dropdown menu-large">
                <a href="/nephrology?cat=879" class="dropdown-toggle" data-toggle="dropdown" title="A">A<b class="caret"></b></a>
                        <ul class="dropdown-menu megamenu row">
                                <li class="col-sm-3 col-lg-2">
                                    <ul>
                                        <li class="dropdown-header">    
                                            <a href="javascript:void(0);" style="cursor:default;" title="A1">A1</a>
                                        </li>
                                        <li class="divider"></li>
                                            <li><a href="/nephrology?p=3061" title="Apple">Apple</a></li>
                                            <li><a href="/nephrology?p=3062" title="Alien">Alien</a></li>
                                            <li><a href="/nephrology?p=3064" title="AI">AI</a></li>
                                            <li><a href="/nephrology?p=3063" title="April">April</a></li>
                                    </ul>
                                </li>
                        </ul>
            </li>
            <li class="dropdown menu-large">
                <a href="/nephrology?cat=874" class="dropdown-toggle" data-toggle="dropdown" title="B">B<b class="caret"></b></a>
                        <ul class="dropdown-menu megamenu row">
                                <li class="col-sm-3 col-lg-2">
                                    <ul>
                                        <li class="dropdown-header">

                                            <a href="javascript:void(0);" style="cursor:default;" title="B1">B1</a>
                                        </li>
                                        <li class="divider"></li>
                                            <li><a href="/nephrology?p=3072" title="Banana">Banana</a></li>
                                            <li><a href="/nephrology?p=3048" title="Babe">Babe</a></li>
                                            <li><a href="/nephrology?p=3036" title="Bamboo">Bamboo</a></li>
                                            <li><a href="/nephrology?p=2771" title="Berry">Berry</a></li>
                                    </ul>
                                </li>
                        </ul>
            </li>

我想抓取 Apple、Alien、AI 和 April 的网址,但不知道该怎么做。我下面的代码只抓取了 A 的 url,即"/nephrology?cat=879"。如何让它刮掉类'类"divider"中的url?因为当我尝试只使用 "divider" 类时,它也会提取 Banana 和其他 url。但我不需要它们。提前致谢!

我的代码:

for item in soup.find_all(attrs={'class':'dropdown menu-large'}):
    for link in item.find_all('a', {'title' : 'A'}):
        href=link.get('href')   #it gets "/nephrology?cat=879"

【问题讨论】:

  • 您的预期结果是否也包括Banana,Babe,Bamboo
  • @Shahin nope :)

标签: python html web-scraping beautifulsoup


【解决方案1】:

试试这个。它将产生您上面提到的确切结果。

from lxml.html import fromstring

root = fromstring(html)
for title in root.cssselect(".dropdown:nth-child(1) .dropdown-header+.divider ~ li"):
    item = ' '.join([title.text for title in title.cssselect("a")])
    print(item)

结果:

Apple
Alien
AI
April

【讨论】:

    【解决方案2】:

    您可以按以下步骤执行此操作:

    • 首先找到汤里所有的&lt;li&gt;元素。

      soup.find_all("li")
      
    • 然后过滤所有只有一个子元素a的元素

      len(list(soup_li.children)) == 1 and soup_li.a
      

    完整的程序可以可视化为:

    from bs4 import BeautifulSoup
    
    with open("./sample.html", "r") as f:
        soup = BeautifulSoup(f.read(), 'html.parser')
        for soup_li in soup.find_all("li"):
            if len(list(soup_li.children)) == 1 and soup_li.a:
                print soup_li.a["href"]
    

    输出:

    /nephrology?p=3061

    /nephrology?p=3062

    /nephrology?p=3064

    /nephrology?p=3063

    /nephrology?p=3072

    /nephrology?p=3048

    /nephrology?p=3036

    /nephrology?p=2771

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 2023-01-04
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多