Python BeautifulSoup - игнорировать дочерние теги и идентификаторы - PullRequest
1 голос
/ 07 октября 2019

У меня есть файл, который имеет структуру ниже.

Я хочу найти все родительские теги, то есть все идентификаторы, которые содержат только цифры, и текст, содержащийся внутри. Однако теперь я получаю плоскую структуру всех тегов a, тегов родителей и детей.

<A ID=101>
<a id=”A1”>Today is a nice day. 
<a id=”A2”>Today is a very nice day.
<a id=”A3”>Today is a very very nice day.
</A>

<A ID=102>
<a id=”A1”>Today is a nice day2. 
<a id=”A2”>Today is a very nice day2.
<a id=”A3”>Today is a very very nice day2.
</A>

Я хочу это только и игнорирую все дочерние теги и идентификаторы. Какой способ извлечь это как это?

<A ID=101>
Today is a nice day. 
Today is a very nice day.
Today is a very very nice day.
</A>

<A ID=102>
Today is a nice day2. 
Today is a very nice day2.
Today is a very very nice day2.
</A>

Ответы [ 2 ]

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

Ваш HTML-код неверен.

См. Ниже исправленный HTML-код + пример кода:

from bs4 import BeautifulSoup

html = '''
<a id="101">
<a id="A1">Today is a nice day.</a>
<a id="A2">Today is a very nice day.</a>
<a id="A3">Today is a very very nice day.</a>
</a>

<a id="102">
<a id="A1">Today is a nice day2.</a>
<a id="A2">Today is a very nice day2.</a>
<a id="A3">Today is a very very nice day2.</a>
</a>
'''

bs = BeautifulSoup( html, "html.parser" )
tags = bs.find_all( "a", recursive = False )

for tag in tags:
    print( "<" + tag.name + ' id="' + tag[ "id" ] + '>' )
    print( tag.text )
    print( "</" + tag.name )
0 голосов
/ 07 октября 2019

Приведенный ниже код может выполнить то, о чем вы просите, при условии, что дочерний и родительский теги имеют разные имена и не являются только прописными и строчными версиями друг друга

html = """
<B ID=101>
<a id=”A1”>Today is a nice day. 
<a id=”A2”>Today is a very nice day.
<a id=”A3”>Today is a very very nice day.
</B>

<B ID=102>
<a id=”A1”>Today is a nice day2. 
<a id=”A2”>Today is a very nice day2.
<a id=”A3”>Today is a very very nice day2.
</B>
"""
invalid_tags = ['a',"html","body"]
soup = BeautifulSoup(html,"lxml")
for tag in invalid_tags: 
    for match in soup.findAll(tag):
        match.replaceWithChildren()
print (soup)

Это потому, что BeautifulSoup по умолчанию имеет делос HTML-данными. HTML не чувствителен к регистру;при разборе все теги в нижнем регистре.

Если вам нужно сопоставить теги с учетом регистра, вам нужно проанализировать документ как XML. Установите lxml (по pip) и скажите BeautifulSoup использовать этот анализатор в режиме XML, например:

soup = BeautifulSoup(source, 'xml')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...