#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 есть только classis-oos
, но когда я запускаю его в response.text, из URL, он говорит, что у Row2 есть class [`is-oos’,»], поэтому ваш код не будет работать, поскольку он перехватывает строку 22. @Bijan можешь поделиться URL-адресом?
3. gun.deals/search/apachesolr_search/736676037018 является одним из них. Я пытаюсь просто сопоставить, есть ли они в наличии (
tr
где class нетis-oos
)4. Ах, я вижу, это умно просто прерывать, когда он видит
js-oos-breaker