【问题标题】:Unable to get some items located scatteredly from a webpage无法从网页中获取一些零散的项目
【发布时间】:2019-12-27 03:04:20
【问题描述】:

我正在尝试使用 python 从网页中获取四个字段,但问题是我所追求的数据不在任何结构化的 html 中,所以我找不到任何方法来单独获取它们。

webpage address

我试过了:

import re
import requests
from bs4 import BeautifulSoup

link = 'https://colegios.es/2012/cra-la-gaznata-san-bartolome-de-pinares/'

def get_content(link):
    res = requests.get(link,headers={'User-Agent':'Mozilla/5.0'})
    soup = BeautifulSoup(res.text,"lxml")
    school_name = soup.select_one("h1 > a").get_text(strip=True)
    school_address = soup.find("p",text=re.compile('Dirección:\s*([^"]*?)')).text
    school_phone = soup.find("p",text=re.compile('Tel\.\s*(.*?)\s*')).text
    print(school_name,school_address,school_phone)

if __name__ == '__main__':
    get_content(link)

我得到的真的是一团糟:

CRA La Gaznata  San Bartolomé de Pinares CRA La Gaznata Servicios:   Jornada contínua,  Educación Infantil y Primaria   Público Dirección:    del Pino, 2  5267  San Bartolomé de Pinares Ávila  Tel. 920 270 070   Fax 920 270 070 05005981@educa.jcyl.es [google-map-v3 addmarkerlist=”del Pino, 2  5267  San Bartolomé de Pinares Ávila {}5-default.png”] CRA La Gaznata Servicios:   Jornada contínua,  Educación Infantil y Primaria   Público Dirección:    del Pino, 2  5267  San Bartolomé de Pinares Ávila  Tel. 920 270 070   Fax 920 270 070 05005981@educa.jcyl.es [google-map-v3 addmarkerlist=”del Pino, 2  5267  San Bartolomé de Pinares Ávila {}5-default.png”]

我希望获取的输出(第二个是名称中可用的郊区):

CRA La Gaznata 
San Bartolomé de Pinares
del Pino, 2 5267 San Bartolomé de Pinares Ávila 
920 270 070

如何从该网页中获取四个字段?

【问题讨论】:

    标签: python regex python-3.x web-scraping


    【解决方案1】:

    关键是将解析器更改为html5lib,这样<br> 标记将通过get_text() 方法正确转换为换行符 - 然后使用re 解析文本更容易:

    import re
    import requests
    from bs4 import BeautifulSoup
    
    link = 'https://colegios.es/2012/cra-la-gaznata-san-bartolome-de-pinares/'
    
    def get_content(link):
        res = requests.get(link,headers={'User-Agent':'Mozilla/5.0'})
        soup = BeautifulSoup(res.text,"html5lib")
    
        text = soup.select_one('.post-content > p').get_text(strip=True, separator='\n')
    
        school_name, suburb = soup.select_one("h1 > a").get_text(strip=True, separator='\n').split('\n')
        school_address = re.findall(r'Dirección:\s*(.*)', text)[0]
        school_phone = re.findall(r'Tel\.\s*([\d\s]+\d)', text)[0]
        email = re.findall(r'[^\s]+@[^\s]+', text)[0]
    
        print(school_name)
        print(suburb)
        print(school_address)
        print(school_phone)
        print(email)
    
    if __name__ == '__main__':
        get_content(link)
    

    打印:

    CRA La Gaznata
    San Bartolomé de Pinares
    del Pino, 2  5267  San Bartolomé de Pinares Ávila
    920 270 070
    05005981@educa.jcyl.es
    

    【讨论】:

    • 完美的安德烈!!!你一直是一个很大的帮助。最后一个请求-您也可以添加电子邮件吗?我在正则表达式方面落后了。
    • @robots.txt 更新了我的答案。也许它不是最好的电子邮件正则表达式,但它适用于这种情况。在 SO 中,您肯定会发现更好的电子邮件正则表达式 :)
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2012-03-18
    相关资源
    最近更新 更多