проверить, имеет ли строка расширение .pdf - PullRequest
0 голосов
/ 17 января 2020

Я очень новичок в соскобе. У меня 2 проблемы. Во-первых, мне нужно удалить определенный раздел сайта, который содержит теги привязки. Мне нужно получить ссылки pdf тегов привязки только вместе с их заголовками, но, к сожалению, теги привязки также имеют нормальные ссылки. Это моя первая проблема

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

веб-сайт. html

<div>
<a href="www.url.com/somethin.pdf">pdf
link</a>

<a href="www.url.com/somethin.pdf">pdf
link</a>

<a href="www.url.com/somethin">normal
link</a>
</div>

scrappy.py

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.privacy.gov.ph/advisories/')
soup = BeautifulSoup(page.content,'html.parser')

section = soup.find("section", {"class": "news_content"})
for link in section.find_all("a"):
   pdf =  link['href'].replace("..", "")
   title =  link.text.strip()
   print("title: " + title + "\t")
   print("pdf_link: " + pdf + "\t")
   print('\n')

Если вы запустите этот код, вы найдете заголовки, содержащие нежелательные новые разрывы строк для этого html кода

Ответы [ 2 ]

1 голос
/ 17 января 2020

Некоторые заголовки в вашем случае имеют \n в теле - вы должны попробовать это:

title =  link.text.strip().replace('\n', '')

Таким образом, ваш окончательный код с фильтрацией .pdf будет выглядеть так:

section = soup.find("section", {"class": "news_content"})
for link in section.find_all("a"):
   pdf =  link['href'].replace("..", "")
   if not pdf.endswith('.pdf'):
       continue
   title =  link.text.strip().replace('\n', '')
   print("title: " + title + "\t")
   print("pdf_link: " + pdf + "\t")
   print('\n')
1 голос
/ 17 января 2020

Вы можете использовать регулярное выражение, чтобы получить href, который заканчивается расширением pdf. Что касается нежелательных разрывов строк, я не уверен, что вы имеете в виду. Я могу только предположить, что вы имеете в виду 2 новые строки между каждым шрифтом. Если это предположение верно, то это потому, что каждая функция print будет находиться на новой строке. поэтому, когда у вас есть print('\n'), он напечатает на новой строке, а затем напечатает новую строку. Если вам нужен только 1 пробел, удалите эту последнюю функцию печати и измените \t на \n

import requests
from bs4 import BeautifulSoup
import re

page = requests.get('https://www.privacy.gov.ph/advisories/')
soup = BeautifulSoup(page.content,'html.parser')

section = soup.find("section", {"class": "news_content"})
links = section.findAll(href=re.compile("\.pdf$")) # <---- SEE HERE

for link in links:
   pdf =  link['href'].replace("..", "")
   title =  link.text.strip().replace('\n','')
   print("title: " + title)
   print("pdf_link: " + pdf + "\n")

Вывод:

title: Updated Templates on Security Incident and Personal Data Breach Reportorial Requirements 
pdf_link: https://www.privacy.gov.ph/wp-content/files/attachments/nwsltr/Final_Advisory18-02_6.26.18.pdf        

title: Guidelines on Privacy Impact Assessments   
pdf_link: https://www.privacy.gov.ph/wp-content/files/attachments/nwsltr/NPC_AdvisoryNo.2017-03.pdf     

title: Access to Personal Data Sheets of Government Personnel 
pdf_link: https://www.privacy.gov.ph/wp-content/files/attachments/nwsltr/NPC_Advisory_No.2017-02.pdf  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...