Beautifulsoup соответствует пустому классу

#python #python-3.x #web-scraping #beautifulsoup

#python #python-3.x #очистка веб-страниц #beautifulsoup

Вопрос:

Я очищаю таблицу на веб-сайте, где я только пытаюсь вернуть любую строку, в которой класс пуст (строки 1 и 4)

 <tr class>Row 1</tr>
<tr class="is-oos ">Row 2</tr>
<tr class="somethingelse">Row 3</tr>
<tr class>Row 4</tr>
  

(Обратите внимание, что в конце is-oos класса есть пробел.

Когда я делаю soup.findAll('tr', class_=None) , это соответствует всем строкам. Это потому, что в строке 2 указан класс ['is-oos', ''] из-за пробела в конце. Есть ли простой способ сделать soup.findAll() или soup.select() , чтобы сопоставить эти строки?

Ответ №1:

Попробуйте class_="" :

 from bs4 import BeautifulSoup

html_doc = """<tr class>Row 1</tr>
<tr class="is-oos ">Row 2</tr>
<tr class="somethingelse">Row 3</tr>
<tr class>Row 4</tr>"""

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

print(*soup.find_all('tr', class_=""))

# Or to only get the text
print( 'n'.join(t.text for t in soup.find_all('tr', class_="")) )
  

Выводит:

 <tr class="">Row 1</tr> <tr class="">Row 4</tr>
Row 1
Row 4
  

Редактировать Чтобы получить только то, что есть в наличии, мы можем проверить атрибуты тега:

 import requests
from bs4 import BeautifulSoup

URL = "https://gun.deals/search/apachesolr_search/736676037018"

soup = BeautifulSoup(requests.get(URL).text, "html.parser")

for tag in soup.find_all('tr'):
    if tag.attrs.get('class') == ['price-compare-table__oos-breaker', 'js-oos-breaker']:
        break
    print(tag.text.strip())
  

Комментарии:

1. Когда я запускаю Beautifulsoup на вашем html_doc , он говорит, что у Row2 есть только class is-oos , но когда я запускаю его в response.text, из URL, он говорит, что у Row2 есть class [`is-oos’,»], поэтому ваш код не будет работать, поскольку он перехватывает строку 2

2. @Bijan можешь поделиться URL-адресом?

3. gun.deals/search/apachesolr_search/736676037018 является одним из них. Я пытаюсь просто сопоставить, есть ли они в наличии ( tr где class нет is-oos )

4. Ах, я вижу, это умно просто прерывать, когда он видит js-oos-breaker