С BeautifulSoup, как мне найти класс элемента в классе? - PullRequest
0 голосов
/ 10 июня 2019

Я использую Python 3.7 и BeautifulSoup 4. Я хочу найти все элементы "div.title", которые встречаются в элементах "td.info".Селектор CSS (я полагаю) выглядел бы как

td.info div.title

Так что я думал, что смогу получить элементы вроде этого

elts = soup.findAll("td", {"class": "info"}).find("div", {"class": "title"})
for div in elts:

, но вместо этого я получаю ошибку

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/davea/Documents/workspace/myproject_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/davea/Documents/workspace/myproject_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/davea/Documents/workspace/myproject_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/davea/Documents/workspace/myproject_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "/Users/davea/Documents/workspace/myproject_project/myproject/management/commands/runstats.py", line 11, in handle
    ret = MediaService.check_url("https://i.redd.it/wazz3axjtk331.jpg")
  File "/Users/davea/Documents/workspace/myproject_project/myproject/services/media_service.py", line 42, in check_url
    results = json.loads(MediaService.parseResults(code, True))
  File "/Users/davea/Documents/workspace/myproject_project/myproject/services/media_service.py", line 96, in parseResults
    elts = soup.findAll("td", {"class": "info"}).find("div", {"class": "title"})
  File "/Users/davea/Documents/workspace/myproject_project/venv/lib/python3.7/site-packages/bs4/element.py", line 1621, in __getattr__
    "ResultSet object has no attribute '%s'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?" % key
AttributeError: ResultSet object has no attribute 'find'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

Что дает?

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Используйте find () для td и find_all () для элемента div

elts = soup.find("td", class_="info").find_all("div", class_="title")
for div in elts:
    print(div['title'])

Если у вас есть несколько тегов td и меньше td, если у вас есть несколько тегов div, попробуйте ниже.


for td in soup.find_all("td", class_="info"):
    for div in td.find_all("div", class_="title"):
        print(div['title'])

Для использования css

for td in soup.select("td.info"):
    for div in td.select("div.title"):
        print(div['title'])
0 голосов
/ 10 июня 2019

Использование:

soup.find_all(".class1.class2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...