Как бы я поцарапал некоторые атрибуты 'title', если их несколько в одном дереве HTML? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь очистить титульную страницу https://nyaa.si/ для имен торрентов и ссылок torrent ma gnet. Мне удалось получить ссылки ma gnet, но у меня возникли проблемы с именами торрентов. Это связано со структурой HTML, в которой размещаются имена торрентов. Содержимое, которое я пытаюсь очистить, находится в теге <td> (который является строкой таблицы), который можно однозначно идентифицировать с помощью атрибута, но после этого содержимое находится в теге <a> под атрибутом <title> который не имеет однозначно идентифицируемого атрибута, который я вижу. Могу ли я в любом случае почистить эту информацию?

Вот мой код:

import re, requests
from bs4 import BeautifulSoup

nyaa_link = 'https://nyaa.si/'
request = requests.get(nyaa_link, headers={'User-Agent': 'Mozilla/5.0'})
source = request.content
soup = BeautifulSoup(source, 'lxml')

#GETTING TORRENT NAMES
title = []
rows = soup.findAll("td", colspan="2")
for row in rows:
    title.append(row.content)

#GETTING MAGNET LINKS
magnets = []
for link in soup.findAll('a', attrs={'href': re.compile("^magnet")}):
    magnets.append(link.get('href'))
print(magnets)

Ответы [ 2 ]

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

Вам нужно вытащить заголовок из ссылки в таблице данных. Поскольку каждый <td> здесь содержит <a>, просто позвоните td.find('a')['title']

import re, requests
from bs4 import BeautifulSoup

nyaa_link = 'https://nyaa.si/'
request = requests.get(nyaa_link, headers={'User-Agent': 'Mozilla/5.0'})
source = request.content
soup = BeautifulSoup(source, 'lxml')

#GETTING TORRENT NAMES
title = []
rows = soup.findAll("td", colspan="2")
for row in rows:
#UPDATED CODE
    desired_title = row.find('a')['title']
    if 'comment' not in desired_title:
        title.append(desired_title)

#GETTING MAGNET LINKS
magnets = []
for link in soup.findAll('a', attrs={'href': re.compile("^magnet")}):
    magnets.append(link.get('href'))
print(magnets)
0 голосов
/ 29 марта 2020

Итак, я разобрался с проблемой и нашел решение

Проблема была в следующей строке: if 'comment' not in desired_title:

Что он сделал, так это только обработал HTML, который не сделал ' не содержать «комментарий». Проблема заключается в том, как структура HTML на странице, которую я пытался очистить, в основном, если бы у торрента был комментарий к нему, отображалась бы в структуре HTML выше, чем название заголовка. Поэтому мой код полностью пропустит торренты с комментариями к ним.

Вот рабочее решение:

import re, requests
from bs4 import BeautifulSoup

nyaa_link = 'https://nyaa.si/?q=test'
request = requests.get(nyaa_link)
source = request.content
soup = BeautifulSoup(source, 'lxml')

#GETTING TORRENT NAMES
title = []
n = 0
rows = soup.findAll("td", colspan="2")
for row in rows:
    if 'comment' in row.find('a')['title']:
        desired_title = row.findAll('a', title=True)[1].text
        print(desired_title)
        title.append(desired_title)
        n = n+1
    else:
        desired_title = row.find('a')['title']
        title.append(desired_title)
        print(row.find('a')['title'])
        print('\n')
#print(title)

#GETTING MAGNET LINKS
magnets = []
for link in soup.findAll('a', attrs={'href': re.compile("^magnet")}):
    magnets.append(link.get('href'))
#print(magnets)

#GETTING NUMBER OF MAGNET LINKS AND TITLES
print('Number of rows', len(rows))
print('Number of magnet links', len(magnets))
print('Number of titles', len(title))
print('Number of removed', n)

Спасибо CannedScientist за часть кода, необходимого для решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...