使用lxml和请求解析HTML列表的问题

时间:2014-04-04 18:34:42

标签: python html html-parsing lxml python-requests

我有一个存储在变量href中的网址列表。当我通过下面的函数传递它时,唯一返回的recipe_links来自href中的第一个URL。我的代码有任何明显的错误吗?我不确定为什么它不会遍历href中存储的所有20个网址。我按照预期检索了href中第一个网址的返回结果,但我无法将循环转到下一个网址。

def first_page_links(link):
    recipe_links = []
    recipe_html = []

    for x in link: 
        page_request = requests.get(x)
        recipe_html.append(html.fromstring(page_request.text))

        print recipe_html

        for x in recipe_html:
            recipe_links.append(x.xpath('//*[@id="content"]/ul/li/a/@href'))

            return recipe_links

2 个答案:

答案 0 :(得分:4)

观看放置return的位置。您可能希望在完成所有循环后返回:

def first_page_links(link):
    recipe_links = []
    recipe_html = []

    for x in link: 
        page_request = requests.get(x)
        recipe_html.append(html.fromstring(page_request.text))

        print recipe_html

        for x in recipe_html:
            recipe_links.append(x.xpath('//*[@id="content"]/ul/li/a/@href'))

    return recipe_links

答案 1 :(得分:2)

尝试推出第二个循环和return行,这样就不会发生冗余迭代,并且正确返回最终列表,如下所示:

from lxml import html
import requests as rq

def first_page_links(links):

    recipe_links = []
    recipe_html = []

    for link in links:
        r = rq.get(link)
        recipe_html.append(html.fromstring(r.text))

    for rhtml in recipe_html:
        recipe_links.append(rhtml.xpath('//*[@id="content"]/ul/li/a/@href'))

    return recipe_links

如果有效,请告诉我们。

修改

请考虑以下事项:

y_list = []
final_list = []
for x in x_list:
    y_list.append(x)
    for y in y_list:
        final_list.append(y)

这是你的功能,简化了。假设在x_list中有3个网址,会发生以下情况:

  1. x1附加到y_list
  2. 到目前为止,
  3. y_list仅使用x1进行处理,因此仅x1附加到final_listfinal_list现在包含:[x1]
  4. x2附加到y_list
  5. y_list现在包含x1x2 两者 都会被处理并附加到final_listfinal_list现在包含:[x1, x1, x2]
  6. x3附加到y_listy_list现在包含x1x2x3
  7. 看看这是怎么回事? :)
  8. 由于第二个循环(处理第一个列表中的项目)位于第一个循环内,后者将增量添加到第一个列表,第二个循环将处理第一个列表 on第一个循环的每次迭代。这使它成为冗余迭代。

    有许多方法可以执行您想要执行的操作,但如果您只是附加到列表并且需要在两者上都进行一次循环,那么上述修复就是所需要的。