Как я могу извлечь ссылки из HTML? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь получить ссылку на каждую статью в этой категории в хронике SF, но я не уверен, с чего мне начать при извлечении URL-адресов.Вот мой прогресс на данный момент:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.sfchronicle.com/local/'

# opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")
zone2_container = page_soup.findAll("div",{"class":"zone zone-2"})
zone3_container = page_soup.findAll("div",{"class":"zone zone-3"})
zone4_container = page_soup.findAll("div",{"class":"zone zone-4"})
right_rail_container = page_soup.findAll("div",{"class":"right-rail"})

Все нужные мне ссылки находятся в zone2-4_container и right_rail_container.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Теперь звучит так, как будто вам нужны все ссылки на статьи, и в этом случае вы можете использовать селектор attribute = value css с оператором contains для назначения href атрибутов, значение которых содержит подстроку article.

import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
base = 'https://www.sfchronicle.com/'
url = 'https://www.sfchronicle.com/local/'
res = requests.get(url)
soup = bs(res.content, 'lxml')
links = [urljoin(base,link['href']) for link in soup.select('[href*=article]')]
print(links)
print(len(links))
0 голосов
/ 17 февраля 2019

Вы можете использовать следующий код для получения всех ссылок:

all_zones = [zone2_container, zone3_container, zone4_container, right_rail_container]
urls = []
for i in all_zones:
    links = i[0].findAll('a')
    for link in links:
        urls.append(link['href'])

Я объединил все списки в один список, но вы также можете определить функцию для достижения того же самого.

def get_urls(zone):
    urls = []
    for i in zone:
        links = i.findAll('a')
        for link in links:
            urls.append(link['href'])
    return urls 

get_urls(zone2_container)

...