Подсчитайте <li>во всех <ul>и посчитайте все конкретные <a>в одной строке - PullRequest
1 голос
/ 20 июня 2019

Я написал код Python для анализа веб-страницы с помощью Beautiful Soup.

Как только код был закончен, я начал удалять ненужные переменные и строки.

Я также пытаюсь удалить циклы, если возможно.

Например, я хотел бы заменить эти два цикла (которые находятся в двух разных файлах) однострочным кодом (например, 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 ]

1 голос
/ 20 июня 2019

strip () * Встроенная функция Python используется для удаления всех начальных и конечных пробелов из строки. 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')
1 голос
/ 20 июня 2019

Для первого цикла:

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

Для второго:

counter = sum(1 for el in list if el.contents[0] != 'Train')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...