一个简单的网络爬虫的问题

时间:2018-01-18 17:20:57

标签: python html css xpath web-crawler

我最近正在使用python学习网络爬虫,我在一个小的示例代码中有一些问题。它有一个包含一些图像的本地html文件和一个抓取它的.py文件。

html文件'first_web.html':

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>First web</title>
    <link rel="stylesheet" type="text/css" href="main.css">
</head>
<body>
    <div class="header">
        <h1>First web</h1>
    </div>
    <div class="main-content">
        <ul class="article">
            <li>
                <img src="1.jpg" width="100" height="90">
                <h3>first</h3>
                <p>This is first</p>
            </li>
            <li>
                <img src="2.jpg" width="100" height="90">
                <h3>second</h3>
                <p>This is second</p>
            </li>
            <li>
                <img src="3.jpg" width="100" height="90">
                <h3>Third</h3>
                <p>This is Third</p>
            </li>
        </ul>
    </div>
    <div class="footer">
        <p>&copy;Alex</p>
    </div>
</body>
</html>

这是.py文件:

from lxml import etree
f = open('first_web.html','r',encoding='utf-8')
# print(f.read())
html = etree.HTML(f.read())
for i in range(1,4):
    img = html.xpath('//div[2]/ul/li[{}]/img/@src'.format(i))[0]
    print(img)

我想问一下li [{}],。format [i],@ src和[0]在这行代码中是什么意思?

img = html.xpath('//div[2]/ul/li[{}]/img/@src'.format(i))[0]

2 个答案:

答案 0 :(得分:0)

{}是一个占位符,由于i调用而成为.format()的值。

>>> print 'My name is {}'.format('Steve')
My name is Steve

[0]表示“此列表中的第一项”,即html.xpath(...)返回多个值,我们只想要第一个。

>>> mylist = [ 'Apples', 'Oranges', 'Bananas' ]
>>> print mylist[0]
Apples

答案 1 :(得分:0)

此行使用python str.format功能创建xpath expression

将python字符串格式与xpath表达式分开是件有点棘手的。

import pandas as pd jf = pd.read_csv("Cliente_x_Pais_Sitio.csv", header=0, sep = ",") del jf['Fill_rate'] del jf['Importe_a_pagar_a_medio'] a = jf.sort_values(by=["Cliente","Auth_domain","Sitio",'Country']) f = a.groupby(["Cliente","Auth_domain","Sitio","Country"], as_index=False)['ECPM_medio'].min() del a['Fecha'] del a['Subastas'] del a['Impresiones_exchange'] f.to_csv('Recom_Sitios.csv', index=False) for item in f['ECPM_medio']: item = float(item) if item <= 0.5: item = item * 0.8 else: item = item * 0.9 item = float("{0:.2f}".format(item)) item for item in item: f['ECPM_medio'] = item f.to_csv('Recom_Sitios22.csv', index=False) 是xpath的一部分,li[{}]是您要查询的{}元素的索引。因为你有一个循环,并希望python变量li的值包含在表达式中。 i将替换为值为{}的格式。

i是xpath的一部分,它会说:“请从选定的img-tag中给我src-attribute的值。”

最终的@src就在那里,因为[0]总是返回一个列表而你想要第一个元素。事实上,你的表达式确保只有一个结果。

如果您希望这可以使用任意数量的图像,您可能会完全删除范围循环和格式化部分并直接使用xpath:

xpath

这样就可以查询第二个div容器列表中所有img标记的HTML并获取它们的src属性。