Парсинг HTML

Найдите текст после элемента в BeautifulSoup

Представьте, что у вас есть следующий HTML:

 <div>
    <label>Name:</label>
    John Smith
</div>

 

И вам нужно найти текст «John Smith» после label элемента.

В этом случае, вы можете обнаружить label элемент текста , а затем использовать .next_sibling свойства :

 from bs4 import BeautifulSoup

data = """
<div>
    <label>Name:</label>
    John Smith
</div>
"""

soup = BeautifulSoup(data, "html.parser")

label = soup.find("label", text="Name:")
print(label.next_sibling.strip())

 

Печать John Smith .

Использование CSS-селекторов в BeautifulSoup

BeautifulSoup имеет ограниченную поддержку CSS селекторов , но охватывает наиболее часто используемые из них. С помощью select() метод , чтобы найти множество элементов и select_one() , чтобы найти один элемент.

Основной пример:

 from bs4 import BeautifulSoup

data = """
<ul>
    <li class="item">item1</li>
    <li class="item">item2</li>
    <li class="item">item3</li>
</ul>
"""

soup = BeautifulSoup(data, "html.parser")

for item in soup.select("li.item"):
    print(item.get_text())

 

Печать:

 item1
item2
item3


 

PyQuery

pyquery - это jquery-подобная библиотека для python. Он очень хорошо поддерживает селекторы CSS.

 from pyquery import PyQuery

html = """
<h1>Sales</h1>
<table id="table">
<tr>
    <td>Lorem</td>
    <td>46</td>
</tr>
<tr>
    <td>Ipsum</td>
    <td>12</td>
</tr>
<tr>
    <td>Dolor</td>
    <td>27</td>
</tr>
<tr>
    <td>Sit</td>
    <td>90</td>
</tr>
</table>
"""

doc = PyQuery(html)

title = doc('h1').text()

print title

table_data = []

rows = doc('#table > tr')
for row in rows:
    name = PyQuery(row).find('td').eq(0).text()
    value = PyQuery(row).find('td').eq(1).text()

    print "%s\t  %s" % (name, value)