raspagem web sem id

votos
0

Preciso de ajuda sobre raspagem web. Aqui está o exemplo 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>

Usando BeautifulSoup, eu poderia começar a tag div html para name = content-name. Mas como faço para obter todo o texto com li tag dentro ul após h2 tag que tem segundo tópico texto? Porque tudo isso está na mesma tag div sem classe específica, id, ou nome. Desde já, obrigado.

Publicado 20/10/2018 em 14:06
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

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)
Respondeu 20/10/2018 em 14:20
fonte usuário

votos
1

É sempre mais difícil quando as etiquetas não têm ids ou classes ou tags pais.

Você pode usar 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)

Devoluções

That Data 1
That Data 2
That Data 3
Respondeu 20/10/2018 em 14:17
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more