Разбор HTML-данных с помощью Python с использованием bs4 - PullRequest
1 голос
/ 25 октября 2019

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

<div class="page"><p />
<p></p>
<p>First line required
</p>
<p>Second line required
</p>
<p>Third line required
</p>
<p>Line 1 not required
</p>
<p>Line 2 not required
</p>
<p></p>
</div>
<div class="page"><p />
<p>line required 1
</p>
<p></p>
<p>line required 2
</p>
<p>line required 3
</p>
<p></p>
<p>line required 4
</p>
<p>line required 5
</p>
<p>line required 6
</p>
<p>Line 1 not required
</p>
<p>Line 2 not required
<p />
</div>

Существующий код, как показано ниже:

soup = BeautifulSoup(file_content, 'html.parser')
for num, page in enumerate(soup.select('.page'), 1):
    content = page.get_text(strip=True, separator=' ').replace("\n", " ")

Ответы [ 2 ]

2 голосов
/ 25 октября 2019
#import packages
from bs4 import BeautifulSoup

with open('test.html', 'r') as f:
    file_content = f.read()
soup = BeautifulSoup(file_content, 'html.parser')

for page in soup.find_all("div", class_="page"):
    page.contents[-3].extract()
    page.contents[-1].extract()

print(soup.prettify())

Кажется, имеет ожидаемый эффект.

Примечания:

  • test.html - ваш HTML-образец
  • Мне пришлось удалить строки -1и -3, который, вероятно, связан с вашим странным html-кодом (<p>Line 2 not required никогда не заканчивается, и тег <p /> не кажется хорошей идеей: Должен ли я использоватьтег в разметке? )

С уважением,

0 голосов
/ 25 октября 2019

Обновленный ответ:


from bs4 import BeautifulSoup

html_str = """<div class="page"><p />
<p></p>
<p>First line required
</p>
<p>Second line required
</p>
<p>Third line required
</p>
<p>Line 1 not required
</p>
<p>Line 2 not required
</p>
<p></p>
</div>
<div class="page"><p />
<p>line required 1
</p>
<p></p>
<p>line required 2
</p>
<p>line required 3
</p>
<p></p>
<p>line required 4
</p>
<p>line required 5
</p>
<p>line required 6
</p>
<p>Line 1 not required
</p>
<p>Line 2 not required
<p />
</div>"""



#Load the html string into bs4 object
soup = BeautifulSoup(html_str, 'lxml')

#Strip off empty tags. This also removes empty <p> tags
[x.decompose() for x in soup.findAll(lambda tag: not tag.contents and not tag.name == 'br' )]



#Load all divs with classname = 'page'
items = soup.find_all('',{'class':'page'})

final_html=''
#This for loop removes the last 2 tags from every div (as requested)
for item in items:
    last_item = str(item.find_all('p')[-1])
    second_last_item = str(item.find_all('p')[-2])
    current_item = str(item)
    current_item = current_item.replace(last_item,'')
    current_item = current_item.replace(second_last_item,'')
    final_html = final_html + current_item


final_soup = BeautifulSoup(final_html)
final_str = final_soup.text
print(final_str)


Вывод:

print(final_str)
--------------------------------
First line required

Second line required

Third line required


line required 1

line required 2

line required 3

line required 4

line required 5

line required 6
...