Соскоб с одноименных тегов с помощью Python / BeautifulSoup - PullRequest
0 голосов
/ 16 мая 2018

Я промочил пальцы на ноге с BeautifulSoup и зацикливался на том, чтобы почерпнуть какую-то конкретную информацию. HTML выглядит следующим образом, например:

<div class="row">
  ::before
    <div class="course-short clearfix">
      ::before
        <div class="course-meta col-sm-12">
           <dl>
              <dt>Language:</dt>
              <dd>English</dd>
              <dt>Author:</dt>
              <dd>John Doe</dd>
              <dt>Institution:</dt>
              <dd>American University</dd>
           </dl>
        </div>
       ...
<div class="row">
  ::before
    <div class="course-short clearfix">
      ::before
        <div class="course-meta col-sm-12">
           <dl>
              <dt>Language:</dt>
              <dd>English</dd>
              <dt>Author:</dt>
              <dd>John Doe, Jr.</dd>
              <dt>Institution:</dt>
              <dd>Another University</dd>
           </dl>
        </div>
       ...

Каждая страница имеет около 10 <div class="row"> тегов, каждый с одинаковым шаблоном <dt> и <dd> (например, Язык, Автор, Учреждение).

Я пытаюсь очистить информацию <dd>American University</dd>, чтобы в конечном итоге создать цикл, чтобы я мог получить эту информацию, специфичную для каждого тега <div class="row">.

Мне удалось сделать следующее:

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.oeconsortium.org/courses/search/?search=statistics")
bsObj = BeautifulSoup(html.read(), "html.parser")
institutions = [x.text.strip() for x in bsObj.find_all('div', 'course-meta col-sm-12', 'dd')]

Но это только дает мне следующий беспорядок для каждого соответствующего <div class="row">:

Language:\n\n\t\t\t\t\t\t\t\t\t\t\tEnglish\t\t\t\t\t\t\t\t\t\nAuthor:\nJohn Doe\nInstitution:\nAmerican University\n Language:\n\n\t\t\t\t\t\t\t\t\t\t\tEnglish\t\t\t\t\t\t\t\t\t\nAuthor:\nJohn Doe, Jr.\nInstitution:\nAnother University\n ...

(я знаю, как .strip(); это не проблема.)

Я не могу понять, как нацелиться на эту третью <dd></dd> для каждого соответствующего <div class="row">. Я чувствую, что это может быть возможно также путем нацеливания на тег <dt>Institution:</dt> (в каждом соответствующем случае это «Учреждение»), но я не могу понять это.

Любая помощь приветствуется. Я пытаюсь создать LOOP, чтобы я мог перебрать, скажем, десять <div class="row"> экземпляров и просто извлечь информацию, относящуюся к тегу "Institution" <dd>.

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Я не могу понять, как нацелиться на этот третий <dd></dd> для каждого соответствующего <div class="row">

find_all вернет список всех вхождений, так что вы можете просто взять третий элемент результата. Хотя вы можете захотеть обернуть все это с try catch, чтобы предотвратить IndexError https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all

Я бы сделал функцию из этого кода, чтобы использовать ее для разных страниц:

soup = BeautifulSoup(html.read(), "html.parser")

result = []
for meta in soup.find_all('div', {'class': 'course-meta'}):
    try:
        institution = meta.find_all('dd')[2].text.strip()
        result.append(institution)  # or whatever you like to store it
    except IndexError:
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...