#python #web-scraping #beautifulsoup #children
Вопрос:
Ситуация
Я пытаюсь очистить вложенный неупорядоченный список из 3 «Рыночных драйверов» из этого HTML:
lt;ligt;Drivers, Challenges, and Trends lt;ulgt; lt;ligt;Market drivers lt;ulgt; lt;ligt;Improvement in girth gear manufacturing technologieslt;/ligt; lt;ligt;Expansion and installation of new cement plantslt;/ligt; lt;ligt;Augmented demand from APAClt;/ligt; lt;/ulgt; lt;/ligt; lt;ligt;Market challenges lt;ulgt; lt;ligt;Increased demand for refurbished girth gear segmentslt;/ligt;
Выпуск № 1:
В списке «Драйверы рынка», который я ищу , нет никаких атрибутов, таких как class
name
или id
, поэтому просто нужно пройти по text
/ string
в нем. Все учебники показывают, как найти с помощью классов, идентификаторов и т. Д.
Выпуск № 2:
На children
этой странице , т. е. 3 элемента списка, их 3, но на других подобных страницах их может быть 0, 4 или 7 или другое количество. Поэтому я хочу заполучить всех детей, независимо от того, сколько их (или ни одного). Я нашел кое-что о том, как заставить детей использовать recursive=False
, а также некоторые другие инструкции, в которых говорится findChildren
, что после этого нельзя использовать BS2
.
Выпуск № 3:
Я пробовал использовать find_all_next
, но учебники не говорят мне, как найти следующий до определенной точки — это всегда о том, чтобы получить ВСЕ следующее. В то время как я мог бы потенциально использовать find_all_next
, если бы у него была какая-то остановка или пока вы не найдете собственность.
Следующий код показывает мою попытку (но она не работает):
import requests from bs4 import BeautifulSoup url = 'https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-DNA-Microarray-30162580/' page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') toc = soup.find("div", id="toc") drivers = toc.find(string="Market drivers").findAll("li", recursive=False).text print(drivers)
Комментарии:
1. Не могли бы вы, пожалуйста, добавить свой ожидаемый результат, пожалуйста, было бы здорово
Ответ №1:
Хотя нет примера ожидаемого результата, я бы рекомендовал следующий подход с требуемой версией Beautiful Soup 4.7.0
Как выбрать?
Выбрав элемент по его собственному тексту и извлеките текст всех его дочерних lt;ligt;
элементов, с которыми вы можете пойти, css selectors
и list comprehension
:
[x.get_text(strip=True) for x in toc.select('li:-soup-contains-own("Market drivers") li')]
или в цикле for:
data = [] for x in toc.select('li:-soup-contains-own("Market drivers") li'): data.append(x.get_text(strip=True)) print(data)
Выход:
['Improvement in girth gear manufacturing technologies', 'Expansion and installation of new cement plants', 'Augmented demand from APAC']
Комментарии:
1. Большое спасибо! Это удивительно и прекрасно работает. Это также совершенно не похоже ни на одну инструкцию или документацию, которые я видел…