Использование BeautifulSoup для извлечения конкретного текста в дубликаты тегов - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю над проектом по цифровым гуманитарным наукам, пытаясь выделить только описания изображений из серии оцифрованных гравюр.(Я также довольно новичок в кодировании и программировании в целом, так как я всего лишь скромный философ, вступающий в воды DH). До сих пор мне удавалось изолировать исходный код, используя Python и скрипт urllib, который выглядит следующим образом:

import urllib.request
import urllib.parse


url = "http://pitts.emory.edu/dia/image_details.cfm?ID=17250"
f = urllib.request.urlopen(url)
print(f.read().decode('utf-8'))

Однако моя проблема возникает в самом исходном коде.Описание содержит другую информацию, которая разбита на теги P и b:

</div>
    <div class="col-sm-6">                                                
    <P>
      <b>Book Title:</b>
      <A HREF="book_detail.cfm?ID=2449">The Holy Bible containing the Old and New Testaments, according to the authorised version. With illustrations by Gustave Doré</a>
    </p>              
    <P>
        <b>Author:</b> Doré, Gustave, 1832-1883
    </p>
    
    <P>
        <b>Image Title:</b> Baptism of Jesus
    </p>
    <P>
      <b>Scripture Reference:</b><ul><li>John 1 (<a href='search.cfm?biblicalbook=John&biblicalbookchapter=1'>further images</a> / <a rel='shadowbox;height=500;width=600' href='http://www.commonenglishbible.com/explore/passage-lookup/?query=John+1'>scripture text</a>)</li></ul>
    </p>
    <P>
        <b>Description:</b> John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right.
    </P>
    <P>
        <A HREF="book_list.cfm?ID=2449">Click here
        </a> for additional images available from this book.
    </P>
    <p>For information on licensing this image, please send an email, including a link to the image, to 
        <a href="mailto:dia@emory.edu?subject=Licensing%20Image%20From%20DIA - 17250">dia@emory.edu</a>
    </p>
</div>

Как я могу использовать BeautifulSoup, чтобы выделить только текст описания из этих тегов?Все, что я до сих пор нашел в StackOverFlow, предполагает, что это может быть выполнимо;однако мне еще предстоит найти что-то, пытающееся сделать это специально.

Опять же, из исходного кода я хочу извлечь только описание "Иоанн Креститель крестит Иисуса ...".Как я мог сделать это?

Спасибо!И еще раз извините за недостаток знаний.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

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

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

url = "http://pitts.emory.edu/dia/image_details.cfm?ID=17250"
f = urllib.request.urlopen(url)

soup = BeautifulSoup(f, 'html.parser')
parent = soup.find("b", text="Description:").parent
parent.find("b", text="Description:").decompose()
print(parent.text)

Я добавил BeautifulSoup и удалил описание.

0 голосов
/ 09 февраля 2019

Я использовал теги

в качестве индекса, а затем выбрал индекс [4].Я просто новичок, но это сработало.

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://pitts.emory.edu/dia/image_details.cfm?ID=17250")

soup = BeautifulSoup(html, 'html.parser')
page = soup.find_all('p')[4].getText()

print(page)
0 голосов
/ 09 февраля 2019

В этом примере мы можем использовать селекторы CSS.Предполагая, что вы используете BeautifulSoup 4.7+, поддержка селектора CSS предоставляется библиотекой soupsieve .Сначала мы будем использовать селектор :has() CSS уровня 4, чтобы найти <p> теги, которые имеют прямой дочерний тег <b>, а затем используем нестандартный селектор :contains супа, чтобы убедиться, что тег <b> содержитDescription:.Затем мы просто печатаем содержимое всех элементов, соответствующих этому критерию, удаляя начальные и конечные пробелы и удаляя Description:.Имейте в виду, что есть несколько способов сделать это, это просто метод, который я выбрал для иллюстрации:

import bs4

markup = """
</div>
<div class="col-sm-6">
<P>
    <b>Book Title:</b>
    <A HREF="book_detail.cfm?ID=2449">The Holy Bible containing the Old and New Testaments, according to the authorised version. With illustrations by Gustave Doré</a>
</p>


    <P>
        <b>Author:</b> Doré, Gustave, 1832-1883
    </p>

    <P>
        <b>Image Title:</b> Baptism of Jesus
    </p>

    <P>
        <b>Scripture Reference:</b><ul><li>John 1 (<a href='search.cfm?biblicalbook=John&biblicalbookchapter=1'>further images</a> / <a rel='shadowbox;height=500;width=600' href='http://www.commonenglishbible.com/explore/passage-lookup/?query=John+1'>scripture text</a>)</li></ul>
    </p>

        <P>
            <b>Description:</b> John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right.
        </P>


    <P>
        <A HREF="book_list.cfm?ID=2449">Click here
        </a> for additional images available from this book.
    </P>

    <p>For information on licensing this image, please send an email, including a link to the image, to 
        <a href="mailto:dia@emory.edu?subject=Licensing%20Image%20From%20DIA - 17250">dia@emory.edu</a>
    </p>


</div>
"""

soup = bs4.BeautifulSoup(markup, "html.parser")

for el in soup.select('p:has(> b:contains("Description:"))'):
    print(el.get_text().strip('').replace('Description: ', ''))

Вывод:

John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...