2017-06-18 122 views
0

因此我对此很陌生,在这个问题上,我一直没能在google上找到任何东西。使用Python Request/lxml进行网页抓取:从ul/li获取数据

我使用要求LXML的Python,我已经看到有很多关于网页抓取不同的模块,但没有任何理由在选择一个另一个?你可以使用request/lxml来做同样的事情吗?例如BeautifulSoup?

无论如何,这里是我的实际的问题;

这是我的代码:

import requests 
from lxml import html 

# Login data 
inputUrl = 'http://forum.mytestsite.com/login' 
usr = 'myusername' 
pwd = 'mypassword' 
payload = dict(login=usr, password=pwd) 

# Open session 
with requests.Session() as s: 
    # Login 
    s.post(inputUrl, data=payload) 

    # Get page data 
    pageResult = s.get('http://forum.mytestsite.com/icons/', allow_redirects=False) 
    pageResult = html.fromstring(pageResult.content) 
    pageIcons = pageResult.xpath('//script[@id="table-icons"]/text()') 
    print pageIcons[0] 

结果打印时pageIcons [0]

<ul id="icons"> 
{{#each icons}} 
    <li data-handle="{{handle}}"> 
    <img src="{{image_path}}" alt="{{desc_or_name this}}" title="{{desc_or_name this}}"> 
    </li> 
{{/each}} 
</ul> 


这是生成的网站/ js代码图标:

<script id="table-icons" type="text/x-handlebars-template"> 
    <ul id="icons"> 
    {{#each icons}} 
     <li data-handle="{{handle}}"> 
     <img src="{{image_path}}" alt="{{desc_or_name this}}" title="{{desc_or_name this}}"> 
     </li> 
    {{/each}} 
    </ul> 
</script> 

而这里的页面上的结果:

<ul id="icons"> 
    <li data-handle="558FSTBI" class=""> 
     <img src="http://testsite.com/icons/558FSTBI.1.png" alt="Icon 1" title="Icon 1"> 
    </li> 
    <li data-handle="310AYTZI"> 
     <img src="http://testsite.com/icons/310AYTZI.1.png" alt="Icon 2" title="Icon 2"> 
    </li> 
    <li data-handle="669PQXBI" class=""> 
     <img src="http://testsite.com/icons/669PQXBI.1.png" alt="Icon 3" title="Icon 3"> 
    </li> 
</ul> 



我的目标:
我想要做的是检索所有的li data手柄,但我一直无法弄清楚如何检索这些数据。所以我的目标是检索所有的图标路径和他们的头衔,有谁能帮我解决这个问题吗?我真的很感激任何帮助:)

+0

'// script'不是呈现的HTML的一部分。你为什么试图解析模板代码? –

+0

嗯,因为我是一个noob:P我是因为脚本的结果给了我实际上想要的ul/li句柄,所以这样做是合乎逻辑的。我的意思是,渲染的HTML是从脚本生成的,对吧?我还能如何获得链接? – Lorena

+0

您无法从python请求获取模板代码。另外,如果它在页面加载后呈现,那么您会得到一个空列表,并且无论如何您都不能使用请求。 https://stackoverflow.com/questions/13960567/reading-dynamically-generated-web-pages-using-python –

回答

0

你不解析liul

开始与这个

//ul[@id='icons']/li/img 

,并从这些元素,你可以提取个人信息

关于第一个问题,beautifulsoup可以选择使用LXML。如果你不认为你需要它,并且对XPath很熟悉,不要担心。

但是,因为它是Javascript生成页面,所以需要一个无头浏览器而不是请求库。

Get page generated with Javascript in Python

Reading dynamically generated web pages using python

+0

这就是奇怪的,如果我尝试我只是得到一个空列表回来。它看起来并不可能获得链接的内容:/我该如何去调试这个? – Lorena

+0

我使用了一个在线XPath工具,并且在我关闭了'' –

+0

感谢您的帮助后,它工作正常。太糟糕了,无法模拟浏览器就无法获得JS生成的页面:/ – Lorena