Python, перебирая список URL для разбора HTML-контента - PullRequest
1 голос
/ 24 сентября 2019

Ниже приведен html источник URL:

<h1>Queue &lt;&lt;hotspot-00:26:BB:05:BB:10&gt;&gt; Statistics </h1>
<ul>
  <li>Source-addresses: 10.10.1.130
  <li>Destination-address: ::/0
  <li>Max-limit: 1.02Mb/2.04Mb (Total: <i>unlimited</i>)
  <li>Limit-at: 1.02Mb/2.04Mb (Total: <i>unlimited</i>)
  <li>Last update: Mon Sep 23 21:41:16 2019

</ul>

и вот мой код:

Примечание , что links - это список urls

for link in links:
    page = requests.get(link).text
    sp1 = BeautifulSoup(page, "html.parser").findAll('h1')
    sp2 = BeautifulSoup(page, "html.parser").findAll('li')
    print(sp1,sp2)

Текущий ВЫХОД

[<h1>Queue &lt;&lt;hotspot-00:26:BB:05:BB:10&gt;&gt; Statistics </h1>] [<li>Source-addresses: 10.10.1.130
  <li>Destination-address: ::/0
  <li>Max-limit: 1.02Mb/2.04Mb (Total: <i>unlimited</i>)
  <li>Limit-at: 1.02Mb/2.04Mb (Total: <i>unlimited</i>)
  <li>Last update: Tue Sep 24 00:27:05 2019

Попытка отредактировать мой код, чтобы получить следующий вывод.

hotspot-00:26:BB:05:BB:10, Limit-at: 1.02Mb/2.04Mb (Total: <i>unlimited

1 Ответ

1 голос
/ 24 сентября 2019

Прежде всего вам не нужно создавать два объекта BeautifulSoup.Что касается вашего вопроса:

import re

for link in links:
    soup = BeautifulSoup(requests.get(link).content, "html.parser")
    header = soup.find('h1').text
    header = re.sub(r'.*<<(.*)>>.*', r'\g<1>', header)
    limit = [elem.text.strip() for elem in soup.find_all('li') if re.search(r'^Limit-at:', elem.text)][0].split('\n')[0]
    print(header, limit)

Я использовал предоставленный вами html для проверки вышеуказанного решения.

Итак, вы получаете списки, потому что вы используете find_all, который всегда возвращает список.

Для заголовка я использовал find тоже самое, но он возвращает только первое совпадение.Затем я делаю некоторую подстановку регулярных выражений, чтобы удалить все, кроме нужной части теста заголовка.

Для предела все немного сложнее, потому что он находится во вложенном элементе li.Поэтому выполните цикл по всем элементам li, добавив элемент, текстовый атрибут которого начинается с «Limit-at:».Поскольку это будет список, я беру элемент 0, разбивая его на символ новой строки, и получается новый список.Затем возьмите нулевой элемент этого, чтобы избавиться от части «Последнее обновление» этого текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...