首页 > 解决方案 > 使用 beautifulsoup 获取页面数

问题描述

我想获取下一个代码 html 中的页数:

<span id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterInfoNumPagMAQ" class="outputText marginLeft0punto5">1</span>

<span id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterInfoTotalPaginaMAQ" class="outputText marginLeft0punto5">37</span>

<span id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterTotalTotalMAQ" class="outputText marginLeft0punto5">736</span>

目标是获得数字 1、37 和 736

我的问题是我不知道如何定义提取数字的行,例如数字 1:

req = requests.get(url)
soup = BeautifulSoup(req.text, "lxml")
first_page = int(soup.find('span', {'id': 'viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterInfoNumPagMAQ'}).getText())

非常感谢

编辑:最后我找到了 Selenium 的解决方案:

numpag = int(driver.find_element_by_xpath('//*[@id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterInfoNumPagMAQ"]').text)
pagtotal = int(driver.find_element_by_xpath('//*[@id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterInfoTotalPaginaMAQ"]').text)
totaltotal = int(driver.find_element_by_xpath('//*[@id="viewns_Z7_AVEQAI930OBRD02JPMTPG21004_:form1:textfooterTotalTotalMAQ"]').text)

谢谢@abarnert,对不起我的问题,这是我的第一篇文章=)

标签: pythonweb-scrapingbeautifulsoup

解决方案


您提供的代码已经适用于您提供的示例。

我的猜测是您的问题是它不适用于任何其他页面,可能是因为这些id值每次都不同。

如果是这种情况,您需要查看(或向我们展示)多个不同的输出,以确定是否有可识别的模式可以与正则表达式或充满字符串操作的函数或其他任何内容匹配。请参阅在文档中搜索树以了解您可以使用的不同类型的过滤器。


作为一个疯狂的猜测,Z7每次AVEQAI930OBRD02JPMTPG21004都被不同的大写和数字字符串替换,但格式的其余部分总是相同的?如果是这样,您可以使用一些非常明显的正则表达式:

rnumpag = re.compile(r'.*:form1:textfooterInfoNumPagMAQ')
rtotalpagina = re.compile(r'.*:form1:textfooterInfoTotalPaginaMAQ')
rtotaltotal = re.compile(r'.*:form1:textfooterTotalTotalMAQ')

numpag = int(soup.find('span', id=rnumpag).string)
totalpagina = int(soup.find('span', id=rtotalpagina).string)
totaltotal = int(soup.find('span', id=rtotaltotal).string)

这适用于您提供的示例,也适用于在我们匹配的部分中有不同字符串的不同页面.*

而且,即使我的疯狂猜测是错误的,这也应该向您展示如何为您实际需要搜索的任何内容编写搜索


作为旁注,您使用的是未记录的遗留功能getText()。这意味着您正在复制和粘贴古老的 BS3 代码。不要那样做。其中一些可以与 BS4 一起使用,即使它没有记录到(如本例中),但这仍然是一个坏主意。这就像在不了解差异的情况下尝试使用 Python 3 运行 Python 2 源代码。

您在这里想要的是get_text(),stringtext, 您应该查看文档中所有这三个的含义以了解区别 - 但在这里,标签中唯一的东西是文本字符串,所以它们都碰巧做了一样。


推荐阅读