想要使用urllib.request获取网页中的所有链接

时间:2016-11-11 07:32:50

标签: python python-3.x web-crawler urllib

当我测试它时,它会一直打印出来(无,0),即使我使用的网址有几个< a href =

<div id="subscription_purchase" style="display:none;">

  <input type="hidden" name="cmd" value="_xclick-subscriptions">
  <input type="hidden" name="a3" id="hiddentotal2" value="5.00">
  ......
  <input type="submit" name="submit" value="PURCHASE SUB" />

</div>

<div id="normal_purchase" style="display:none;">

  <input type="hidden" name="cmd" value="_xclick">
  <input type="hidden" name="amount" id="hiddentotal2"  value="1">
  ...... 
  <input  type="submit" name="submit" value="PURCHASE NORM" />

</div>

6 个答案:

答案 0 :(得分:4)

你应该使用美丽的汤,而不是满足你的要求,它的工作非常顺利。我将在下面举一个例子:

from bs4 import BeautifulSoup
import requests

def links(url):
    html = requests.get(url).content
    bsObj = BeautifulSoup(html, 'lxml')

    links = bsObj.findAll('a')
    finalLinks = set()
    for link in links:
        finalLinks.add(link.attrs['href'])

答案 1 :(得分:1)

试试这个

  

import urllib.request

     

导入重新

     

#pass any url url =   “Want to get all links in a webpage using urllib.request

     

urllist = re.findall(r“”“&lt; \ s * a \ s * href = [”']([^ =] +)[“']”“”,   urllib.request.urlopen(URL).read()。解码( “UTF-8”))

     

打印(urllist)

答案 2 :(得分:0)

这是另一种解决方案:

from urllib.request import urlopen

url = ''
html = str(urlopen(url).read())

for i in range(len(html) - 3):
    if html[i] == '<' and html[i+1] == 'a' and html[i+2] == ' ':
        pos = html[i:].find('</a>')
        print(html[i: i+pos+4])

定义您的网址。 希望这有帮助,不要忘记投票和接受。

答案 3 :(得分:0)

这些解决方案之一怎么样?

import requests
from bs4 import BeautifulSoup

research_later = "giraffe"
goog_search = "https://www.google.co.uk/search?sclient=psy-ab&client=ubuntu&hs=k5b&channel=fs&biw=1366&bih=648&noj=1&q=" + research_later

r = requests.get(goog_search)
print r

soup = BeautifulSoup(r.text, "html.parser")
print soup
import requests
from bs4 import BeautifulSoup
r = requests.get("http://www.flashscore.com/soccer/netherlands/eredivisie/results/")
soup = BeautifulSoup(r.content)
htmltext = soup.prettify()
print htmltext
import sys,requests,csv,io
from bs4 import BeautifulSoup
from urllib.parse import urljoin

url = "http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen-rankings"
r = requests.get(url)
r.content
soup = BeautifulSoup(r.content, "html.parser")

maindiv = soup.find_all("div", {"class": "text-center"})
for div in maindiv:
    print(div.text)

答案 4 :(得分:0)

有时BeautifulSoup和请求不是您要使用的。

在某些情况下,使用请求库时,相关网站可能会阻止您进行抓取(获取响应403)。因此,您必须改用urllib.request。

在这里,您可以使用urllib.request获取要抓取的网页上列出的所有链接(href)。

import urllib.request
from urllib.request import urlretrieve, Request, urlopen
import re

# get full html code from a website
response = Request('https://www.your_url.com', headers={'User-Agent':      'Mozilla/5.0'})

webpage = urlopen(response)
print(webpage.read())

# create a list of all links/href tags 
url = 'https://www.your_url.com'

urllist = re.findall("href=[\"\'](.*?)[\"\']",    urllib.request.urlopen(url).read().decode("utf-8"))

print(urllist)

# print each link on a seperate line
for elem in urllist:
    print(elem)

在代码中,我们将str.decode(x)与选定的纯文本编码x一起使用,以将HTML对象转换为纯文本字符串。标准编码为utf-8。如果您要抓取的网站使用不同的编码,则可能需要更改编码。

我们在正则表达式的帮助下找到链接:在纯文本字符串上使用正则表达式模式href = \“ \'[\” \']调用re.findall(pattern,string)以匹配所有href标记,但仅提取引号后的网址文本,以返回href标记内包含的链接列表。

答案 5 :(得分:0)

尝试使用request-html来尝试解析HTML,然后我们可以搜索HTML中的任何标签,clad或ID

from requests_html import HTMLSession
session = HTMLSession()
r = session.get(url)
r.html.links

如果您要使用绝对链接

r.html.absolute_links