Как получить детей из списка без атрибутов с помощью BeatifulSoup?

#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. Большое спасибо! Это удивительно и прекрасно работает. Это также совершенно не похоже ни на одну инструкцию или документацию, которые я видел…