Как почистить ссылки, названия, авторов и метки времени для 10 статей здесь? Выход супа отличается от браузера - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь получить ссылки , заголовки , авторов и отметки времени из 10 статей на этой веб-странице: https://www.investing.com/equities/micron-tech-news

На момент написания статьи

Первая статья - это ссылка "https://www.investing.com/news/economy/take-five-swap-lines-to-the-rescue-2117042",

заголовок «Возьми пять: поменять линии на помощь»,

автор «By Reuters»

и отметка времени «22 часа go».

Всего на странице 10 статей. Однако, когда я пытаюсь запустить beautifulsoup4 с запросами, я получаю кучу статей, которых не должно быть там до появления первой правильной статьи.

И в конце появляется куча ненужных статей, в конце появляются только 4 ссылки, в то время как другие не должны быть там.

Я не знаю, почему веб-страница загружается так. Как я могу go делать то, что я хочу?

Я использую следующий код:

import requests
from bs4 import BeautifulSoup

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}

link = "https://www.investing.com/equities/micron-tech/"

linklist = []
r = requests.get(link, headers=header)

soup = BeautifulSoup(r.text, "html")
links = soup.findAll("a", { "class" : "img" }) 
titles = soup.findAll("a", { "class" : "title" })
details = soup.findAll("span",{"class":"articleDetails"}) #contains the author and time stamp

for i in range(len(links)):
    print(links[i]['href']) #links
    print(titles[i]['title']) #titles
    # print(details[i]['span']) #doesnt work
    print(details[i])  #author and time stamp 

Как вы видите, у меня есть 2 проблемы, во-первых, статьи не похоже на веб-сайт, во-вторых, я не могу получить доступ к деталям, которые показывают автора и метку времени, когда я пытаюсь сделать детали [я] ['span'] я получаю ошибку.

1 Ответ

1 голос
/ 21 марта 2020

На самом деле кажется, что в верхней части страницы также есть статьи, поэтому вам, возможно, придется взглянуть на второго родителя div, например, class=mediumTitle1. Также для элементов с классом articleDetails иногда они равны div, иногда они равны span, поэтому вы можете использовать find(class_="articleDetails").findNext("span") для извлечения автора, чтобы иметь дело с обоими:

import requests
from bs4 import BeautifulSoup

r = requests.get(
    "https://www.investing.com/equities/micron-tech-news",
    headers= {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"}
)
soup = BeautifulSoup(r.text, "html.parser").find_all("div",{"class":"mediumTitle1"})[1]

result = []
for i in soup.find_all("article"):
    data = {}
    data["link"] = i.find("a", {"class":"img"})["href"]
    data["title"] = i.find("a", {"class":"title"}).text
    details = i.find(class_="articleDetails").find_all("span")
    data["author"] = details[0].text
    data["date"] = details[1].text
    result.append(data)

print(result)
...