【问题标题】:Wrong links pulled. Beautifulsoup , python拉错了链接。美丽的汤,蟒蛇
【发布时间】:2019-03-20 20:15:56
【问题描述】:

这是我在这里的第一篇文章,所以请耐心等待。

我正在尝试从我当地的新闻网站上抓取所有包含特定单词的链接(城市名称 - Gdańsk)。

问题是,我收到了一些没有城市名称的链接。

import requests 
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import lxml
import re
url = 'http://www.trojmiasto.pl'
nazwa_pliku = 'testowyplik.txt'
user_agent = UserAgent()

strona = requests.get(url,headers={'user-agent':user_agent.chrome})
with open(nazwa_pliku,'w') as plik:
    plik.write(page.content.decode('utf-8')) if type(page.content) == bytes else file.write(page.content)

def czytaj():
    plikk = open('testowyplik.txt')
    data = plikk.read()
    plikk.close()
    return data

soup = BeautifulSoup(czytaj(),'lxml')

linki = [li.div.a for div in soup.find_all('div',class_='entry-letter')]
for lin in linki:
        print(lin)

rezultaty = soup.find_all('a',string=re.compile("Gdańsk"))

print(rezultaty)

l=[]

s=[]

for tag in rezultaty:

    l.append(tag.get('href'))

    s.append(tag.text)

for i in range(len(s)):
        print('url = '+l[i])
        print('\n')

【问题讨论】:

  • 你的输出是什么?

标签: python web-scraping beautifulsoup


【解决方案1】:

这是 Python 3 中一个完整且更简单的示例:

import requests
from bs4 import BeautifulSoup

city_name = 'Gdańsk'
url = 'http://www.trojmiasto.pl'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}

with requests.get(url, headers=headers) as html:
    if html.ok:
        soup = BeautifulSoup(html.content, 'html.parser')
        links = soup('a')
        for link in links:
            if city_name in link.text:
                print('\t- (%s)[%s]' % (link.text, link.get('href')))

这是上面代码的输出(为了清楚起见,格式化为 Markdown):

- [ZTM Gdańsk](//ztm.trojmiasto.pl/)
- [ZTM Gdańsk](https://ztm.trojmiasto.pl/)
- [Polepsz Gdańsk i złóż projekt do BO](https://www.trojmiasto.pl/wiadomosci/Polepsz-Gdansk-i-zloz-projekt-do-BO-n132827.html)
- [Pomnik Pileckiego stanie w Gdańsku](https://www.trojmiasto.pl/wiadomosci/Pomnik-rotmistrza-Witolda-Pileckiego-jednak-stanie-w-Gdansku-n132806.html)
- [O Włochu, który pokochał Gdańsk](https://rozrywka.trojmiasto.pl/Roberto-M-Polce-Polacy-maja-w-sobie-cos-srodziemnomorskiego-n132686.html)
- [Plakaty z poezją na ulicach Gdańska](https://kultura.trojmiasto.pl/Plakaty-z-poezja-na-ulicach-Gdanska-n132696.html)
- [Uniwersytet Gdański skończył 49 lat](https://nauka.trojmiasto.pl/Uniwersytet-Gdanski-skonczyl-50-lat-n132797.html)
- [Zapisz się na Półmaraton Gdańsk](https://aktywne.trojmiasto.pl/Zapisz-sie-na-AmberExpo-Polmaraton-Gdansk-2019-n132785.html)
- [Groźby na witrynach barów w Gdańsku](https://www.trojmiasto.pl/wiadomosci/Celtyckie-krzyze-i-grozby-na-witrynach-barow-w-Gdansku-n132712.html)
- [Stadion Energa Gdańsk](https://www.trojmiasto.pl/Stadion-Energa-Gdansk-o25320.html)
- [Gdańsk Big Beat Day 2019  ](https://www.trojmiasto.pl/rd/?t=p&id_polecamy=59233&url=https%3A%2F%2Fimprezy.trojmiasto.pl%2FGdansk-Big-Beat-Day-2019-imp475899.html&hash=150ce9c9)
- [ZTM Gdańsk](https://ztm.trojmiasto.pl/)

【讨论】:

    【解决方案2】:

    您可以尝试使用包含运算符 (*) 的属性 = 值

    rezultaty = [item['href'] for item in soup.select("[href*='Gdansk']")]
    

    完整脚本

    import requests
    from bs4 import BeautifulSoup as bs
    
    r = requests.get('http://www.trojmiasto.pl')
    soup = bs(r.content, 'lxml')    
    rezultaty = [item['href'] for item in soup.select("[href*='Gdansk']")]
    print(rezultaty)
    

    没有列表理解:

    for item in soup.select("[href*='Gdansk']"):
        print(item['href'])
    

    【讨论】:

    • 我试过了,谢谢!但是我意识到为什么我会收到类似 ,,(ztm.trojmiasto.pl)'' 的答案。这是因为标题中有 ,,Gdańsk''。
    • 您要求提供任何包含 gdansk 的链接。上面就是这样做的。它不应该返回您显示的链接,除非 gdansk 在 url 字符串中
    • 这很有帮助。但是现在我正在努力以更结构化的方式(每行一个链接)来放置它。我尝试在你的循环中放置 print('\n') 但没有成功。
    • 符合预期?
    • 嘿,到目前为止是的 :) 。我有数以百万计的问题,但试图自己解决,直到我真的不知道该怎么做。