Próbuję to zrobić:

req = urllib.request.Request("http://en.wikipedia.org/wiki/Philosophy")
content = urllib.request.urlopen(req).read()
soup = bs4.BeautifulSoup(content, "html.parser")
content = strip_brackets(soup.find('div', id="bodyContent").p)

for link in bs4.BeautifulSoup(content, "html.parser").findAll("a"):
    print(link.get("href"))

Jeśli zamiast tego zrobię do pętli:

for link in soup.findAll("a"):
    print(link.get("href"))

Nie otrzymuję już błędu, ale chcę najpierw usunąć wsporniki treści, a następnie uzyskać wszystkie linki treści.

Błąd (linia 36 to linia pętli):

Traceback (most recent call last):
  File "....py", line 36, in <module>
    for link in bs4.BeautifulSoup(content, "html.parser").findAll("a"):
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\bs4\__init__.py", line 191, in __init__
    markup = markup.read()
TypeError: 'NoneType' object is not callable

Co ja robię źle?

0
osk 24 czerwiec 2017, 18:06

4 odpowiedzi

Najlepsza odpowiedź

Twoim celem jest uzyskanie listy linków, prawda?

To da Ci linki:

content = urlopen('http://en.wikipedia.org/wiki/Philosophy')
soup = BeautifulSoup(content, "html.parser")
base=soup.find('div', id="bodyContent")

for link in BeautifulSoup(str(base), "html.parser").findAll("a"):
    if 'href' in link.attrs:
        print(link['href'])
5
Dmitriy Fialkovskiy 24 czerwiec 2017, 15:24

Zamiast for link in bs4.BeautifulSoup(content, "html.parser").findAll("a"): spróbuj użyć for link in content.findAll('a'): Nie ma potrzeby ponownego parse content.

0
Sam Chats 24 czerwiec 2017, 15:29

Nie rozumiem, czego naprawdę chcesz. W swoim kodem

import urllib
import bs4 

req = urllib.request.Request("http://en.wikipedia.org/wiki/Philosophy")
content = urllib.request.urlopen(req).read()
soup = bs4.BeautifulSoup(content, "html.parser")

for link in soup.findAll("a"):
    print(link.get("href"))

https://zh.wikipedia.org/wiki/%E5%93%B2%E5%AD%A6
https://www.wikidata.org/wiki/Q5891#sitelinks-wikipedia
//en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License
//creativecommons.org/licenses/by-sa/3.0/
//wikimediafoundation.org/wiki/Terms_of_Use
//wikimediafoundation.org/wiki/Privacy_policy
//www.wikimediafoundation.org/
https://wikimediafoundation.org/wiki/Privacy_policy
/wiki/Wikipedia:About
/wiki/Wikipedia:General_disclaimer
//en.wikipedia.org/wiki/Wikipedia:Contact_us
https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute
https://wikimediafoundation.org/wiki/Cookie_statement
//en.m.wikipedia.org/w/index.php?title=Philosophy&mobileaction=toggle_view_mobile
https://wikimediafoundation.org/
//www.mediawiki.org/
1847



  With Dmitry's code


/wiki/Help:Category
/wiki/Category:Philosophy
/wiki/Category:CS1_maint:_Uses_editors_parameter
/wiki/Category:Pages_using_ISBN_magic_links
/wiki/Category:Wikipedia_indefinitely_semi-protected_pages
/wiki/Category:Use_dmy_dates_from_April_2016
/wiki/Category:Articles_containing_Ancient_Greek-language_text
/wiki/Category:Articles_containing_Sanskrit-language_text
/wiki/Category:All_articles_with_unsourced_statements
/wiki/Category:Articles_with_unsourced_statements_from_May_2016
/wiki/Category:Articles_containing_potentially_dated_statements_from_2016
/wiki/Category:All_articles_containing_potentially_dated_statements
/wiki/Category:Articles_with_DMOZ_links
/wiki/Category:Wikipedia_articles_with_LCCN_identifiers
/wiki/Category:Wikipedia_articles_with_GND_identifiers
1592

Użyłem tego polecenia dla obu programów

python s2.py | tee >(wc -l)

Druga część jest do liczenia linii ekranowych.

1
MishaVacic 24 czerwiec 2017, 15:38

Co próbujesz rozebrać? Możesz to zrobić.

from bs4 import BeautifulSoup as bs
import urllib

url = "http://en.wikipedia.org/wiki/Philosophy"
soup = bs(urllib.urlopen(url), "html.parser")
links = soup.find('div', id="bodyContent").p.findAll("a")
for link in links:
    print link.get("href")
1
jroxbury 24 czerwiec 2017, 15:38