Использование BeautifulSoup для извлечения <ul><li> элементов и хранения их структуры - PullRequest
0 голосов
/ 15 января 2020

В последнее время я работаю над проблемой извлечения структуры. Но я не знаю, как это решить. У меня есть html слом как это:

<ul>
    <li><object type="text/sitemap"><param name="Name" value="level1"/)</object>
    <ul>
        <li><object type="text/sitemap"><param name="Name" value="data1"/></object></li>
        <li><object type="text/sitemap"><param name="Name" value="level2"/></object>
        <ul>
            <li><object type="text/sitemap"><param name="Name" value="data2"/></object></li>    
            <li><object type="text/sitemap"><param name="Name" value="data3"/></object></li>
        </ul>
    </ul>
</ul>

Я хочу получить желаемый результат, как это:

output = [level1 --- data1, level1 --- level2 ----data2, level1 ---- level2 ----data3]

Что мне делать?

1 Ответ

0 голосов
/ 16 января 2020

Не знаю, отсутствует ли ваш тег HTML . После того, как я его добавлю, результат выполнения с использованием simpifieddo c будет следующим:

from simplified_scrapy.simplified_doc import SimplifiedDoc
html='''
<ul>
    <li><object type="text/sitemap"><param name="Name" value="level1"/></object>
    <ul>
        <li><object type="text/sitemap"><param name="Name" value="data1"/></object></li>
        <li><object type="text/sitemap"><param name="Name" value="level2"/></object>
        <ul>
            <li><object type="text/sitemap"><param name="Name" value="data2"/></object></li>    
            <li><object type="text/sitemap"><param name="Name" value="data3"/></object></li>
        </ul>
    </ul>
</ul>'''
def test(ul,l_name,lst):
  l1s = ul.children
  l1_len=len(l1s)
  for i in range(0,l1_len-1): # level1
    l1 = l1s[i]
    l1n = l1s[i+1]
    if l1.tag=='li':
      if l1n.tag=='ul':
        l_name = l_name+'-'+l1.param.value if l_name else l1.param.value
        test(l1n,l_name,lst)
      else:
        lst.append(l_name+'-'+l1.param.value)
    if i==l1_len-2:
      if l1n.tag=='li':
        lst.append(l_name+'-'+l1n.param.value)
doc = SimplifiedDoc()
doc.loadHtml(doc.replaceReg(html,'</object>[\s]*<ul','</object></li><ul'))
ul = doc.ul
lst = []
test(ul,'',lst)
print (lst)

Результат:

['level1-data1', 'level1-level2-data2', 'level1-level2-data3']

Примеры SimplifiedDo c можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...