веб-соскоб без идентификатора - PullRequest
0 голосов
/ 20 октября 2018

Мне нужна помощь по очистке веб-страниц.Вот пример HTML:

<div class="content" name="content-name">
   <h2 class="Topic">First Topic</h2>
   <ul>
      <li>This Data 1</li>
      <li>This Data 2</li>
      <li>This Data 3</li>
   </ul>
   <h2 class="Topic">Second Topic</h2>
   <ul>
      <li>That Data 1</li>
      <li>That Data 2</li>
      <li>That Data 3</li>
   </ul>
   <h2 class="Topic">Third Topic</h2>
   <ul>
      <li>Their Data 1</li>
      <li>Their Data 2</li>
      <li>Their Data 3</li>
   </ul>
</div>

Используя BeautifulSoup, я мог получить тег html div для name = "content-name".Но как мне получить весь текст с тегом li внутри ul после тега h2 , который имеет текст «второй темы»?Потому что все это находится в одном теге div без определенного класса, идентификатора или имени.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018
from bs4 import BeautifulSoup

src = """
<div class="content" name="content-name">
    <h2 class="Topic">First Topic</h2>
    <ul>
        <li>This Data 1</li>
        <li>This Data 2</li>
        <li>This Data 3</li>
    </ul>
    <h2 class="Topic">Second Topic</h2>
    <ul>
        <li>That Data 1</li>
        <li>That Data 2</li>
        <li>That Data 3</li>
    </ul>
    <h2 class="Topic">Third Topic</h2>
    <ul>
        <li>Their Data 1</li>
        <li>Their Data 2</li>
        <li>Their Data 3</li>
    </ul>
</div>
"""

soup = BeautifulSoup(src, 'lxml')

content = soup.find_all("div", class_="content")[0]


second_topic = content.find_all("h2", class_="Topic", string="Second Topic")[0]

ul = second_topic.next_sibling.next_sibling

li = ul.find_all("li")
for i in li:
    print(i.string)
0 голосов
/ 20 октября 2018

Всегда сложнее, когда у тегов нет идентификаторов, классов или родительских тегов.

Вы можете использовать find_previous_sibling

from bs4 import BeautifulSoup
html = """
<div class="content" name="content-name">
   <h2 class="Topic">First Topic</h2>
   <ul>
      <li>This Data 1</li>
      <li>This Data 2</li>
      <li>This Data 3</li>
   </ul>
   <h2 class="Topic">Second Topic</h2>
   <ul>
      <li>That Data 1</li>
      <li>That Data 2</li>
      <li>That Data 3</li>
   </ul>
   <h2 class="Topic">Third Topic</h2>
   <ul>
      <li>Their Data 1</li>
      <li>Their Data 2</li>
      <li>Their Data 3</li>
   </ul>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')

for ul in soup.find_all('ul'):
    if ul.find_previous_sibling('h2').text == 'Second Topic':
        for li in ul.find_all('li'):
            print(li.text)

Возвращает

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