Перейдите по ссылке на форуме, чтобы очистить тему (комментарии) с помощью BS4 - PullRequest
1 голос
/ 08 мая 2020

У меня форум с 3 ветками. Я пытаюсь очистить данные во всех трех сообщениях. поэтому мне нужно перейти по ссылке href к каждому сообщению и очистить данные. это вызывает у меня ошибку, и я не уверен, в чем я ошибаюсь ...

import csv
import time
from bs4 import BeautifulSoup
import requests

source = requests.get('https://mainforum.com').text

soup = BeautifulSoup(source, 'lxml')

#get the thread href (thread_link)
for threads in soup.find_all('p', class_= 'small'):
    thread_name = threads.text
    thread_link = threads.a.get('href')# there are three threads and this gets all 3 links
    print (thread_link)

Остальная часть кода - это то, с чем у меня возникла проблема?

# request the individual thread links
for follow_link in thread_link:
    response = requests.get(follow_link)

    #parse thread link
    soup= BeautifulSoup(response, 'lxml')

    #print Data
    for p in soup.find_all('p'):
        print(p)

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Что касается ошибки вашей схемы ...

Вы получаете ошибку схемы, потому что вы перезаписываете одну ссылку снова и снова. Затем вы пытаетесь вызвать эту ссылку, как если бы это был список ссылок. На данный момент это строка, и вы просто перебираете символы (начиная с h), следовательно, возникает ошибка.

См. Здесь: requests.exceptions.MissingSchema: Invalid URL 'h': Схема не предоставлена ​​


Что касается общего запроса и как решить что-то вроде этого ...

Если бы я был для этого поток будет go следующим образом:

  1. Получить три href (аналогично тому, что вы уже сделали)
  2. Используйте функцию, которая очищает href потока по отдельности и возвращает все, что вы хотите, чтобы они вернули
  3. Сохранить / добавить эту возвращенную информацию, где хотите.
  4. Повторить

Что-то вроде этого, возможно

import csv
import time
from bs4 import BeautifulSoup
import requests

source = requests.get('https://mainforum.com')

soup = BeautifulSoup(source.content, 'lxml')

all_thread_info = []

def scrape_thread_link(href):
    response = requests.get(href)

    #parse thread link
    soup= BeautifulSoup(response.content, 'lxml')

    #return data
    return [p.text for p in soup.find_all('p')]

#get the thread href (thread_link)
for threads in soup.find_all('p', class_= 'small'):
    this_thread_info = {}
    this_thread_info["thread_name"] = threads.text
    this_thread_info["thread_link"] = threads.a.get('href')
    this_thread_info["thread_data"] = scrape_thread_link(this_thread_info["thread_link"])
    all_thread_info.append(this_thread_info)

print(all_thread_info)

В исходном вопросе довольно много неуказанного, поэтому я сделал некоторые предположения. В идеале, вы можете видеть суть.

Также обратите внимание, что я предпочитаю использовать .content из response вместо .text.

0 голосов
/ 08 мая 2020

@ Darien Schettler Я внес некоторые изменения / поправки в код, хотелось бы услышать, если я где-то напортачил?

all_thread_info = []

def scrape_thread_link(href):
    response = requests.get(href)
    soup= BeautifulSoup(response.content, 'lxml')

    for Thread in soup.find_all(id= 'discussionReplies'):
        Thread_Name = Thread.find_all('div', class_='xg_user_generated')
        for Posts in Thread_Name:
            print(Posts.text)


for threads in soup.find_all('p', class_= 'small'):
    thread_name = threads.text
    thread_link = threads.a.get('href')
    thread_data = scrape_thread_link(thread_link)
    all_thread_info.append(thread_data)
...