Автоматически очищать несколько вопросов из кворы с определенным тегом? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу почистить вопросы из Кворы, относящиеся к какой-то конкретной теме, в которой содержится более 4 ответов или около того.

Я хочу найти

a) Количество ответов

b) теги, связанные с каждым вопросом

Это моя программа:

res=requests.get("https://www.quora.com/How-does-Quora-automatically-know-what-tags-to-put-for-a-question")

soup=BeautifulSoup(res.text, 'lxml')
# All the ans inside pagedlist_item
ans=soup.find_all('div', {'class' : 'pagedlist_item'})


#Question Name inside question_text_edit
qname=soup.find('div', {'class' : 'question_text_edit'})
#qnam=soup.find('div', {'class' : 'question_text_edit'})


#Tag of Question
tags=soup.find('div', {'class' : 'QuestionTopicHorizontalList TopicList'})



#checking to see if "TV" is the tag of the question in the current webpage 
#Also, checking if no. of answers of the given question >=4, if yes then print the question
#logic for checking the conditions
no_ans=0;
if "TV" in tags.text:
    print(i.text)
    for a in ans:
        no_ans=no_ans+1
    if no_ans>=4:
        print(qname.text)

Я хочу выполнить поиск по многим таким страницам, которые имеют тег TV, а затем выполнитьпроверьте эти страницы, чтобы выполнить указанное выше условие.

Логика проверки условий присутствует в конце кода.Но это будет работать только для одного вопроса на веб-странице, адрес которой находится внутри функции requests.get("").

Как можно разрешить коду автоматически перебирать множество веб-страниц (несколько вопросов) с тегом «TV» вместо передачи одного адреса веб-страницы в функцию requests.get("")?

Кроме того,Я хочу ответить на несколько вопросов (целых 40 или около того).

1 Ответ

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

Я отвечу на эти шаг за шагом:

I want to search over many such pages which have the tag TV and then later perform the check over those pages to satisfy the above condition.

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

Also, I want to scrape multiple questions(as many as 40 or so)

Для этого вам нужно имитировать прокрутку, чтобы вы могли найтивсе больше и больше вопросов по мере того, как вы спускаетесь.

Вы не можете напрямую использовать Requests, BeautifulSoup для выполнения таких событий, как имитация операции прокрутки.Вот фрагмент кода, который у меня есть в Python с использованием библиотеки Selenium для выполнения ваших требований.

Примечание :

  1. Установка Драйвер Chrome для вашей версии Chrome .

  2. установка селена с использованием pip install -U selenium.

  3. Если вы используете windows - executetable_path= '/ path / to / chromedriver.exe'

Этот код запрашивает 2 ссылки, а затем начинает очистку " Вопрос, Количество ответов, Теги, 4 ответа"и сохраняет их в формате csv .

Keys.PAGE_DOWN используется для имитации кнопки прокрутки.Различные данные были добавлены в список row, и в конце он сохраняется в файле csv.

Также вы можете изменить значение переменной no_of_pagedowns, чтобы увеличить no.свитков вы хотите.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv


with open('submission.csv','w') as file:
    file.write("Question,No. of answers,Tags,4 answers")

link1 = input("Enter first link")
#link2 = input("Enter second link")
manylinks = list()
manylinks.append(link1)
#manylinks.append(link2)
for olink in manylinks:
    qlinks = list()    
    browser = webdriver.Chrome(executable_path='/Users/ajay/Downloads/chromedriver')
    browser.get(olink)
    time.sleep(1)
    elem = browser.find_element_by_tag_name("body")


    no_of_pagedowns = 50
    while no_of_pagedowns:
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.2)
        no_of_pagedowns-=1
    post_elems =browser.find_elements_by_xpath("//a[@class='question_link']")
    for post in post_elems:
        qlink = post.get_attribute("href")
        print(qlink)
        qlinks.append(qlink)

    for qlink in qlinks:

        append_status=0

        row = list()

        browser.get(qlink)
        time.sleep(1)


        elem = browser.find_element_by_tag_name("body")


        no_of_pagedowns = 1
        while no_of_pagedowns:
            elem.send_keys(Keys.PAGE_DOWN)
            time.sleep(0.2)
            no_of_pagedowns-=1


        #Question Names
        qname =browser.find_elements_by_xpath("//div[@class='question_text_edit']")
        for q in qname:
            print(q.text)
            row.append(q.text)


        #Answer Count    
        no_ans = browser.find_elements_by_xpath("//div[@class='answer_count']")
    #    print("No. of ans :")
        for count in no_ans:
    #        print(count.text)
            append_status = int(count.text[:2])

            row.append(count.text)

        #Tags
        tags = browser.find_elements_by_xpath("//div[@class='header']")
    #    print("\nTag :")
        tag_field = list()
        for t in tags:
            tag_field.append(t.text)
    #        print(t.text,'\n')
        row.append(tag_field)


        #All answers
        all_ans=browser.find_elements_by_xpath("//div[@class='ui_qtext_expanded']")
        i=1
        answer_field = list()
        for post in all_ans:
            if i<=4:
                i=i+1
    #            print("Answer : ")
    #            print(post.text)
                answer_field.append(post.text)
            else:
                break   
        row.append(answer_field)


        print('append_status',append_status)

        if append_status >= 4:
            with open('submission.csv','a') as file:
                writer = csv.writer(file)
                writer.writerow(row)
...