Python ftech Заголовок и PDF-ссылка с URL - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь получить ссылку на название книги и URL-адрес встроенной книги из URL-адреса, исходное содержание URL-адреса html выглядит следующим образом, я только что извлек из него небольшую часть, чтобы понять.

Имя ссылки когда здесь .. Однако небольшая часть источника html выглядит следующим образом ..

<section>
  <div class="book row" isbn-data="1601982941">
    <div class="col-lg-3">
      <div class="book-cats">Artificial Intelligence</div>
      <div style="width:100%;">
        <img alt="Learning Deep Architectures for AI" class="book-cover" height="261" src="https://storage.googleapis.com/lds-media/images/Learning-Deep-Architectures-for-AI_2015_12_30_.width-200.png" width="200"/>
      </div>
    </div>
    <div class="col-lg-6">
      <div class="star-ratings"></div>
      <h2>Learning Deep Architectures for AI</h2>
      <span class="meta-auth"><b>Yoshua Bengio, 2009</b></span>
      <div class="meta-auth-ttl"></div>
      <p>Foundations and Trends(r) in Machine Learning.</p>
      <div>
        <a class="btn" href="http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf" rel="nofollow">View Free Book</a>
        <a class="btn" href="http://amzn.to/1WePh0N" rel="nofollow">See Reviews</a>
      </div>
    </div>
  </div>
</section>
<section>
  <div class="book row" isbn-data="1496034023">
    <div class="col-lg-3">
      <div class="book-cats">Artificial Intelligence</div>
      <div style="width:100%;">
        <img alt="The LION Way: Machine Learning plus Intelligent Optimization" class="book-cover" height="261" src="https://storage.googleapis.com/lds-media/images/The-LION-Way-Learning-plus-Intelligent-Optimiz.width-200.png" width="200"/>
      </div>
    </div>
    <div class="col-lg-6">
      <div class="star-ratings"></div>
      <h2>The LION Way: Machine Learning plus Intelligent Optimization</h2>
      <span class="meta-auth"><b>Roberto Battiti &amp; Mauro Brunato, 2013</b></span>
      <div class="meta-auth-ttl"></div>
      <p>Learning and Intelligent Optimization (LION) is the combination of learning from data and optimization applied to solve complex and dynamic problems. Learn about increasing the automation level and connecting data directly to decisions and actions.</p>
      <div>
        <a class="btn" href="http://www.e-booksdirectory.com/details.php?ebook=9575" rel="nofollow">View Free Book</a>
        <a class="btn" href="http://amzn.to/1FcalRp" rel="nofollow">See Reviews</a>
      </div>
    </div>
  </div>
</section>

Я пробовал ниже код:

Этот код только что получил название книги или заголовок, но все еще имеет заголовок <h2> с печатью. Я с нетерпением жду возможности распечатать Book name и pdf-ссылку книги.

#!/usr/bin/python3
from bs4 import BeautifulSoup as bs
import urllib
import urllib.request as ureq


web_res = urllib.request.urlopen("https://www.learndatasci.com/free-data-science-books/").read()

soup = bs(web_res, 'html.parser')

headers = soup.find_all(['h2'])
print(*headers, sep='\n')

#divs = soup.find_all('div')
#print(*divs, sep="\n\n")

header_1 = soup.find_all('h2', class_='book-container')
print(header_1)

вывод:

<h2>Artificial Intelligence A Modern Approach, 1st Edition</h2>
<h2>Learning Deep Architectures for AI</h2>
<h2>The LION Way: Machine Learning plus Intelligent Optimization</h2>
<h2>Big Data Now: 2012 Edition</h2>
<h2>Disruptive Possibilities: How Big Data Changes Everything</h2>
<h2>Real-Time Big Data Analytics: Emerging Architecture</h2>
<h2>Computer Vision</h2>
<h2>Natural Language Processing with Python</h2>
<h2>Programming Computer Vision with Python</h2>
<h2>The Elements of Data Analytic Style</h2>
<h2>A Course in Machine Learning</h2>
<h2>A First Encounter with Machine Learning</h2>
<h2>Algorithms for Reinforcement Learning</h2>
<h2>A Programmer's Guide to Data Mining</h2>
<h2>Bayesian Reasoning and Machine Learning</h2>
<h2>Data Mining Algorithms In R</h2>
<h2>Data Mining and Analysis: Fundamental Concepts and Algorithms</h2>
<h2>Data Mining: Practical Machine Learning Tools and Techniques</h2>
<h2>Data Mining with Rattle and R</h2>
<h2>Deep Learning</h2>

Желаемый вывод:

Title: Artificial Intelligence A Modern Approach, 1st Edition
Link: http://www.cin.ufpe.br/~tfl2/artificial-intelligence-modern-approach.9780131038059.25368.pdf

Пожалуйста, помогите Я понимаю, как этого добиться, потому что гуглял, но из-за недостатка знаний я не могу этого получить. так как когда я вижу источник html, то там много div и class, поэтому не слишком сложно понять, какой класс выбрать href и h2.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

HTML очень хорошо структурирован, и вы можете использовать это здесь. Сайт, очевидно, использует Bootstrap в качестве леса стиля (с классами row и col-[size]-[gridcount], которые вы в основном можете игнорировать.

По сути, у вас есть

  • a <div class="book"> книга
    • столбец с категорией
      • <div class="book-cats"> и
      • изображение
    • второй столбец с
      • <div class="star-ratings"> блок оценок
      • <h2> название книги
      • <span class="meta-auth"> строка автора
      • <p> описание книги
      • две ссылки с <a class=“btn" ...>

Большинство из них можно игнорировать. И заголовок, и требуемая ссылка являются первым элементом их типа, поэтому вы можете просто использовать element.nested_element чтобы схватить либо.

Так что все, что вам нужно сделать, это

  • l oop через все book делений.
  • для каждого такого деления, возьмите h2 и первые a элементы.
  • Для заголовка возьмите содержащийся текст h2
  • Для ссылки возьмите атрибут href a якорная ссылка.

вот так:

for book in soup.select("div.book:has(h2):has(a.btn[href])"):
    title = book.h2.get_text(strip=True)
    link = book.select_one("a.btn[href]")["href"]
    # store or process title and link
    print("Title:", title)
    print("Link:", link)

Я использовал .select_one() с селектором CSS, чтобы немного подробнее указать c о том, какой элемент ссылки принимать; .btn определяет класс и [href], что атрибут href должен присутствовать.

Я также улучшил поиск книг, ограничив его элементами div, имеющими как заголовок, так и по крайней мере 1 ссылку; :has(...) селектор ограничивает пределы с теми, у которых заданы c дочерние элементы.

Выше приведено:

Title: Artificial Intelligence A Modern Approach, 1st Edition
Link: http://www.cin.ufpe.br/~tfl2/artificial-intelligence-modern-approach.9780131038059.25368.pdf
Title: Learning Deep Architectures for AI
Link: http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf
Title: The LION Way: Machine Learning plus Intelligent Optimization
Link: http://www.e-booksdirectory.com/details.php?ebook=9575
... etc ...
0 голосов
/ 23 февраля 2020

Вы можете получить основную идею из этого кода:

for items in zip(soup.find_all(['h2']), soup.find_all('a', class_="btn")):
    h2, href = items[0].text, items[1].get('href')
    print('Title:', h2)
    print('Link:', href)
...