关于python:获取标签的href,该标签位于
  • Getting the href of <a> tag which is in <li>

    如何获取给定代码中"子论坛"类下的所有标记的Href?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    `<li class="subforum">
     Link1 Text
     
    </li>

     <li class="subforum">
    Link2 Text

    </li>

    <li class="subforum">
    Link3 Text

    </li>
    `

    我试过这个代码,但显然不起作用。

    1
    2
    3
    4
    `Bs = BeautifulSoup(requests.get(url).text,"lxml")
    Class = Bs.findAll('li', {'class': 'subforum"'})
    for Sub in Class:
    print(Link.get('href'))`


    href属于a标记,不是li标记,用li.a得到a标记。

    文档:使用标记名导航

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import bs4

    html = '''<li class="subforum">
     Link1 Text
     
    </li>

     <li class="subforum">
    Link2 Text

    </li>

    <li class="subforum">
    Link3 Text

    </li>
    `'''


    soup = bs4.BeautifulSoup(html, 'lxml')
    for li in soup.find_all(class_="subforum"):
        print(li.a.get('href'))

    出:

    1
    2
    3
    Link1
    Link2
    Link3

    为什么使用class_

    搜索具有特定css类的标记非常有用,但css属性的名称class是python中的保留字。使用class作为关键字参数会导致语法错误。从beautiful soup 4.1.2开始,可以使用关键字参数class_通过css类进行搜索。


    您就快到了,只需为您所找到的每个li找到一个a元素:

    1
    2
    3
    Class = Bs.findAll('li', {'class': 'subforum"'})
    for Sub in Class:
        print(Sub.find("a").get('href'))  # or Sub.a.get('href')

    但是,有一种更简单的方法-CSS选择器:

    1
    2
    for a in Bs.select("li.subforum a"):
        print(a.get('href'))

    这里,li.subforum a将匹配li元素下所有a元素,这些元素具有subforum类属性。

    附带说明,在BeautifulSoup4中,findAll()更名为find_all()。而且,您应该遵循python通用变量命名准则。