在所有<ul>中计数<li>,并在一个行代码中计数所有特定的<a>

时间:2019-06-20 09:38:29

标签: python beautifulsoup

我编写了Python代码来通过Beautiful Soup分析网页。

代码完成后,我开始删除不必要的变量和行。

如果可能的话,我也正在尝试删除for循环。

例如,我想用一个行代码(例如len(an object))替换这两个循环(在两个不同的文件中):

(1)所有<li>中的<ul>个计数

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
list = soup.find_all('ul',{'class':'class-name'})
counter = 0
for ul in list:
    for li in ul:
        counter += 1

其中list对象是这样的

[<ul class="class-name">
<li class="section"><a href="...">...</a></li>
<li class="section"><a href="...">...</a></li>
<li class="section"><a href="...">...</a></li></ul>, 
<ul class="class-name">
<li class="section"><a href="...">...</a></li>
<li class="section"><a href="...">...</a></li></ul>]

(2)计算所有特定的<a>

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
list = soup.find('table',{'class':'class-name'}).find_all('a')
counter = 0
for el in list:
    if el.contents[0] != 'Train':
        counter += 1

list类似于

[<a href="…">Train</a>,
<a href="…">Car</a>,
<a href="…">Plane</a>]

我尝试过的

使用numpy,但是在两种情况下,命令np.array(list)np.asarray(list)都会出错:

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    np.array(list)
  File "C:\...\Python37-32\lib\site-packages\bs4\element.py", line 1016, in __getitem__
    return self.attrs[key]
KeyError: 0

在情况(2)中,我尝试使用切片符号逐个元素地检索元素,但是诸如list[1:3]之类的命令返回另一个数组。因此,例如,这段试图获取total length minus the number of elements whose contents[0] is 'Train'的代码不起作用:

counter = len(list) - (list[:].contents[0] == 'Train')

是否可以用一个行代码替换两个循环?

2 个答案:

答案 0 :(得分:1)

对于第一个循环:

counter = sum(1 for ul in list for li in ul)

第二个:

counter = sum(1 for el in list if el.contents[0] != 'Train')

答案 1 :(得分:1)

Python的

strip()内置函数用于删除字符串中的所有前导和尾随空格。 sum()内置函数接受一个可迭代的函数,并返回其中的项之和

list1 = soup.find('table',{'class':'class-name'}).find_all('a')
counter = len(list1) - sum(1 for a in list1 if a.text.strip() == 'Train')