Как мне правильно извлечь и проанализировать предметные данные с веб-страницы, используя python и BS4? - PullRequest
1 голос
/ 29 апреля 2019

Я собираюсь создать веб-сканер, который собирает тематические строки с форумов.После этого я хотел бы отобразить каждую тему в виде новой строки с [*] в начале каждой строки.

Используя BeautifulSoup, я могу захватить страницу и извлечькласс span "предмет".Оттуда, однако, я не уверен, как разобрать только текст темы, а затем упорядочить его так, как я пытаюсь.

import requests

from bs4 import BeautifulSoup

url = "https://boards.4channel.org/sci/"

#send the HTTP request
response = requests.get(url)

if response.status_code == 200:

    #pull the content
    html_content = response.content

    #send the page to BeautifulSoup
    html_doc     = BeautifulSoup(html_content, "html.parser")

    #extract topic data
    topic_spider = html_doc.find_all("span",{"class":"subject"})

    print topic_spider

Текущие результаты от сканера выглядят так:

[<span class="subject"></span>, <span class="subject"></span>, <span class="subject">Cigarettes vs. Cannabis</span>, <span class="subject">Cigarettes vs. Cannabis</span>, <span class="subject"></span>, <span class="subject"></span>, <span class="subject"></span>, <span class="subject"></span>, <span class="subject"></span>...

Я пытаюсь заказать их так:

[*] Topic 1
[*] Topic 2
[*] Topic 3

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Проверьте, не является ли текст элемента нулевым, затем удалите дубликаты и отсортируйте список, а затем пройдите и добавьте [*] к строке. Надеюсь, что это после вас. Если не дайте мне знать ваш ожидаемый результат.

import requests
from bs4 import BeautifulSoup

url = "https://boards.4channel.org/sci/"

#send the HTTP request
response = requests.get(url)

if response.status_code == 200:

    #pull the content
    html_content = response.content

    #send the page to BeautifulSoup
    html_doc     = BeautifulSoup(html_content, "html.parser")

    #extract topic data
    topic_spider = html_doc.find_all("span",{"class":"subject"})
    data=[]
    for topic in topic_spider:
        if topic.text!='':
             data.append(topic.text)
    mylist = list(dict.fromkeys(data)) #Remove the duplicates here
    mylist.sort(reverse=False) #sort here
    for d in mylist:
        print ('[*]' + d)
0 голосов
/ 30 апреля 2019

Используйте понимание набора с :not(:empty) псевдоклассами CSS. Вывод уже в алфавитном порядке, но вы всегда можете вызвать метод сортировки

import requests
from bs4 import BeautifulSoup as bs

url = "https://boards.4channel.org/sci/"
r = requests.get(url)
soup = bs(r.content, "lxml")
data = {"[*]" + item.text for item in soup.select('.subject:not(:empty)')}
#data.sort()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...