Путаница с BeautifulSoup.find? - PullRequest
       3

Путаница с BeautifulSoup.find?

1 голос
/ 23 октября 2019

Я пытаюсь получить информацию об адвокатах университетов, которые посещают определенные юридические фирмы, но я не уверен, как получить оба университета, перечисленных в этой ссылке: https://www.wlrk.com/attorney/hahn/. Как видно на первом связанном изображении, два университета этоприсутствующий адвокат находится под двумя отдельными тегами «li».

Когда я запускаю следующий код, я получаю html только до конца первого тега 'li' (как видно на втором связанном изображении), но не второй раздел li, поэтому я получаю толькоПервый университет "Колледж Карлтон":

import requests
from bs4 import BeautifulSoup as soup
url = 'https://www.wlrk.com/attorney/hahn/'
res = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'})
personal_soup = soup(res.content, "html.parser")    
education = personal_soup.find("div",{'class':'attorney--education'})
education.li.a.text # 'Carleton University'

фрагмент кода HTML вывод

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Измените свой анализатор, и я бы использовал select и нацелился на элементы a напрямую. «lxml» более простителен и будет обрабатывать случайные закрывающие теги a, которых там быть не должно. Кроме того, find вернул бы только первое совпадение по сравнению с find_all, которое возвращает все совпадения.

например,

<a href="/attorneys/?asf_ugs=257">Carleton College</a></a>

Конечный тег паразитных сообщений a.

Из строки 231, столбец 127;в строку 231, столбец 130

ollege</a></a>, 2013

конечный тег паразитного элемента. в строку 231, столбец 242

of Law</a></a>, J.D.

источник

import requests
from bs4 import BeautifulSoup as soup

url = 'https://www.wlrk.com/attorney/hahn/'
res = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'})
personal_soup = soup(res.content, "lxml")    
educations = [a.text for a in personal_soup.select('.attorney--education a')]
print(educations)
0 голосов
/ 23 октября 2019

bs получает только первый элемент li. Я не уверен почему. Если вы хотите попробовать использовать lxml, вот способ,

import lxml
from lxml import html


url = 'https://www.wlrk.com/attorney/hahn/'
res = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'})

tree = html.fromstring(res.content)
education = tree.xpath("//div[@class='attorney--education']//li/a/text()")

print(education)

output:

['Carleton College', 'Школа права Нью-Йоркского университета']

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