2017-04-08 85 views
2

这是我的第一个问题,如果我解释了任何错误,请原谅我。从特定网址上刮下链接

我想从python中的特定网站抓取url,并将链接解析为csv。事情是当我在BeautifulSoup解析网站我无法提取网址,因为当我在Python中解析它时,我只能得到<div id="dvScores" style="min-height: 400px;">\n</div>,并且没有在该分支下。但是,当我打开控制台并复制链接所在的表格并将其粘贴到文本编辑器时,它会粘贴600页的html。我想要做的是编写一个显示链接的for循环。 html的结构如下:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
#shadow-root (open) 
<head>...</head> 
<body> 
    <div id="body"> 
    <div id="wrapper"> 
     #multiple divs but i don't need them 
     <div id="live-master"> #what I need is under this div 
     <span id="contextual"> 
      #multiple divs but i don't need them 
      <div id="live-score-master"> #what I need is under this div 
      <div ng-app="live-menu" id="live-score-rightcoll"> 
       #multiple divs but i don't need them 
       <div id="left-score-lefttemp" style="padding-top: 35px;"> 
       <div id="dvScores"> 
        <table cellspacing=0 ...> 
        <colgroup>...</colgroup> 
        <tbody> 
         <tr class="row line-bg1"> #this changes to bg2 or bg3 
         <td class="row"> 
          <span class="row"> 
          <a href="www.example.com" target="_blank" class="td_row"> 
            #I need to extract this link 
          </span> 
         </td> 
         #Multiple td's 
         </tr> 
         #multiple tr class="row line-bg1" or "row line-bg2" 
         . 
         . 
         . 
        </tbody> 
        </table> 
        </div> 
       </div> 
       </div> 
      </div> 
     </span> 
    </div> 
    </div> 
</body> 
</html> 

我在做什么错了?我需要为python自动化一个系统,而不是将html粘贴到文本并用正则表达式提取链接。 我的Python代码如下也是:

import requests 
from bs4 import BeautifulSoup 
r=requests.get("http://example.com/example") 
c=r.content 
soup=BeautifulSoup(c,"html.parser") 
all=soup.find_all("span",id="contextual") 
span=all[0].find_all("tbody") 
+0

你能指定你想要的输出吗?它是否像Url:'http:// www.mackolik.com/Mac/2581146/Kayserispor-Osmanlıspor-FK'? – vold

+0

@vold是正确的。对于每场比赛都有一个在球队名字之间的链接。这是我想要提取的链接。 – Gorkem

回答

0

本网站使用JavaScript来填充它的内容,因此,你不能获得通过beautifulsoup网址。如果您在浏览器中检查网络选项卡,则可以发现this link。它包含你所需要的所有数据。你可以简单地解析它并提取所有需要的值。

import requests 

req = requests.get('http://goapi.mackolik.com/livedata?group=0').json() 
for el in req['m'][4:100]: 
    index = el[0] 
    team_1 = el[2].replace(' ', '-') 
    team_2 = el[4].replace(' ', '-') 
    print('http://www.mackolik.com/Mac/{}/{}-{}'.format(index, team_1, team_2)) 
+0

谢谢sooo多。我想问最后一件事,一些链接包含'http://www.mackolik.com/Mac/...',一些链接应该包含'http://www.mackolik.com/Basket-Mac/ .. 。我怎么能写出区别这两者的东西? – Gorkem

+0

对不起,但我必须把它留给你。我可以发现,这些网址对于足球和篮球队来说是不同的。你需要在json数据中发现他们之间的差异(可能是他们的联盟的名字?),并在脚本中添加一条条件语句来检查差异并返回正确的url。或者,您可以根据当前位置简单地更改网址:首先,在返回足球网址后,将“篮子”添加到网址并返回剩余的篮球网址。 – vold

+0

按照您的建议找到了标识符以区分这些类型。再次感谢您:) – Gorkem

1

,如果你想刮网址,那么你应该得到的HREF:

urls = soup.find_all('a', href=True) 
+0

我试过了,它不起作用,我不知道为什么,但是通过传递' Gorkem

+1

中的链接确定吗?我设法从您发布的样本中提取“www.example.com”。你能告诉我实际的页面吗? –

+0

“www.mackolik.com/Canli-Sonuclar”我需要的链接是你点击分数的链接。 – Gorkem

0

这似乎是HTML被动态地生成的JS。您需要使用抓取工具来抓取它以模仿浏览器。由于您正在使用requests,它已经有一个履带式的session

session = requests.session() 
data = session.get ("http://website.com").content #usage xample 

在这之后,你可以做解析,另外刮等

+0

我试过了,但没有工作,它只给了来自网站头几行。 – Gorkem

+0

也许网站正在检查用户代理。您是否尝试将用户代理更改为Chrome之类的东西? – Dashadower