我想在下一个代码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())
非常感谢
编辑:最终我找到了硒解决方案:
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,对于我的问题深表歉意,这是我的第一篇文章=)
答案 0 :(得分:0)
您提供的代码已经可以用于您提供的示例。
我的猜测是您的问题是它不适用于其他任何页面,可能是因为这些id
值每次都不同。
在这种情况下,您需要查看(或向我们展示)多个不同的输出,以判断是否存在可以与正则表达式或充满字符串操作的函数匹配的可识别模式。有关可以使用的各种过滤器,请参见文档中的Searching the tree。
一个疯狂的猜测,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()
,string
或text
,并且您应该查看文档中这三者的含义,以了解两者之间的区别-但在这里,标签内唯一的东西是文本字符串,因此它们都碰巧做同样的事情。