Python BS4 find () find_all () возвращает пустые списки - PullRequest
0 голосов
/ 12 декабря 2018

Hy, я пытаюсь почистить веб-сайт https://www.dawn.com/pakistan, но метод python find () find_all () возвращает пустые списки, я попробовал html5.parser, html5lib и lxml, но все же не повезло.Классы, которые я пытаюсь очистить, присутствуют как в исходном коде, так и в объекте супа, но кажется, что все не работает, любая помощь будет оценена, спасибо!

Код:

from bs4 import BeautifulSoup 

import lxml

import html5lib

import urllib.request

url1 = 'https://www.dawn.com/pakistan'


req = urllib.request.Request(
    url1, 
    data=None, 
    headers=
{
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
}
                        )
url1UrlContent=urllib.request.urlopen(req).read()
soup1=BeautifulSoup(url1UrlContent,'lxml')

url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black- 
font--playfair-display')
print(url1Section1)

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я не думаю, что вы можете передавать составные имена классов таким образом.Я использую Это составные имена классов.Я использовал селекторы CSS в качестве более быстрого метода поиска.Соединения заполнены ".".

Если вы после заголовков, вы можете использовать немного другую комбинацию селекторов

import requests
from bs4 import BeautifulSoup

url= 'https://www.dawn.com/pakistan'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
items = [item.text.strip() for item in soup.select('h2[data-layout=story] a')]
print(items)

Чтобы ограничиться только теми слева, вы можете использовать:

items = [item.text.strip() for item in soup.select('.story__title.size-five.text-black.font--playfair-display a' )]

В более широком смысле,

items = [item.text.strip() for item in soup.select('article [data-layout=story]')] 

Согласно вашему комментарию:

items = [item.text.strip() for item in soup.select('.col-sm-6.col-12')] 
0 голосов
/ 12 декабря 2018

ваш должен работать (я использовал другой синтаксис).Но эта строка, которая у вас есть, не соответствует.

у вас есть: 'story__title-size-five-text-black- font--playfair-display'

, и у меня есть: 'story__title size-five text-black font--playfair-display ' это очень небольшая разница

replace:

url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black- font--playfair-display')

с:

url1Section1=soup1.find_all('h2', {'class':'story__title size-five text-black font--playfair-display '})

и посмотрите, поможет ли это

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