Извлечение текста и изображения с веб-страницы с помощью BeautifulSoup - PullRequest
1 голос
/ 02 апреля 2020

Мне кажется, что я ударился о стену и мне нужна помощь / руководство.

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

В файле HTML есть несколько вхождений вне заголовка и связанного текста:

Пример:

<h2>Builder ind=BOB</h2>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=left valign=top>
</td>
<td align=left valign=top><br>
<h3>TEST -- TXF 1234 -- 04/01/2020 6:21:42 PM</h3>
<img src="gfx/image117.png" width=997 height=601>

<h2>Builder ind=ROB</h2>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=left valign=top>
</td>
<td align=left valign=top><br>
<h3>TEST -- EXF 1234 -- 04/01/2020 6:21:42 PM</h3>
<img src="gfx/image118.png" width=997 height=601>

В приведенном выше примере я пытаюсь извлечь текст, содержащийся внутри тегов h2 и связанного с ним тега img sr c и экспортировать их в файл csv

Извлечение имеющегося у меня текстового кода изображения: {from urllib.request import urlopen from bs4 import BeautifulSoup import re

fname = '\\\\C:\\TEMP\\\PAGE.htm' 
html= open(fname)
bs = BeautifulSoup(html, 'html.parser')
images = bs.find_all('img', {'src':re.compile('.png')})
for image in images: 
    print(image['src']+'\n')

Как бы я go рассказал о циклическом просмотре файла и извлечении как текста, так и порта и в файл?

В конечном выводе я пытаюсь для достижения следующего в CSV-файле:

  1. ind = BOB, image117.png
  2. ind = ROB, image118.png

Вывод, который Я получаю в настоящее время:

gfx / image117.png

GFX / image118.png

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Попробуйте этот подход:

from bs4 import BeautifulSoup
import re
fname = '\\\\C:\\TEMP\\\PAGE.htm' 
html= open(fname)
bs = BeautifulSoup(html, 'html.parser')
images = bs.find_all('img', {'src':re.compile('.png')})
headings = bs.find_all('h2')
for i in range(len(images)): 
    print(headings[i].text.split(" ")[1]+", "+images[i]['src'])

Вывод:

ind=BOB, gfx/image117.png
ind=ROB, gfx/image118.png

Или Если вы хотите сохранить свои выходные данные в CSV-файле, поэтому вы должны попробовать этот подход:

from bs4 import BeautifulSoup
import re
import csv

fname = 'PAGE.htm' 
html= open(fname)
bs = BeautifulSoup(html, 'html.parser')
images = bs.find_all('img', {'src':re.compile('.png')})
headings = bs.find_all('h2')
with open('data.csv', 'w') as file:
    writer = csv.writer(file)
    for i in range(len(images)):
        #headingPlusImage = list(headings[i].text.split(" ")[1]+", "+images[i]['src'])
        heading = headings[i].text.split(" ")[1]
        image = images[i]['src']
        print(heading,"," ,image)
        writer.writerow([heading, image])
0 голосов
/ 02 апреля 2020
from bs4 import BeautifulSoup
html = """
<h2>Builder ind=BOB</h2>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=left valign=top>
</td>
<td align=left valign=top><br>
<h3>TEST -- TXF 1234 -- 04/01/2020 6:21:42 PM</h3>
<img src="gfx/image117.png" width=997 height=601>

<h2>Builder ind=ROB</h2>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=left valign=top>
</td>
<td align=left valign=top><br>
<h3>TEST -- EXF 1234 -- 04/01/2020 6:21:42 PM</h3>
<img src="gfx/image118.png" width=997 height=601>
"""

soup = BeautifulSoup(html, 'html.parser')

for item in soup.findAll("h2"):
    print("Text: {}, Image: {}".format(
        item.text, item.find_next("img").get("src")))

Выход:

Text: Builder ind=BOB, Image: gfx/image117.png
Text: Builder ind=ROB, Image: gfx/image118.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...