【发布时间】:2016-05-29 15:58:29
【问题描述】:
我不确定是什么问题。但是我有一个使用 Selenium 和 Beautifulsoup 4 的小脚本来访问和解析使用特定输入的特定网站的内容。对于每个搜索词,我想将元素附加到列表中。这是html:
<table class="aClass">
<tr class="1">
<td>
<a href="aLink">
<span class="aClass">
Text
</span>
</a>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
<tr class="2">
<td>
</td>
<td anAttribute="aValue">
Text
</td>
<td>
</td>
</tr>
</table>
想要的 td 在第二个 tr 中,跨度在它之前的那个中。该模式在表格元素内持续 X 次命中。
每个列表中的预期结果是 238,但是当我打印长度时它甚至没有接近。它在 25 处停止。当我将数据写入文件时,存在同样的问题。然而,该列表确实包含所有不同搜索的结果。我认为我定位元素的方式可能是问题所在,但与 html 的结构相比,情况似乎并非如此。是否以错误的方式循环遍历元素?
完整代码:
def searchAndExtract():
searches = ['Search1', 'Search2', 'Search3']
textContents = []
idContents = []
data = []
data.append(['ID', 'MESSAGE'])
driver = webdriver.PhantomJS()
url = 'https://website.com'
driver.get(url)
for search in searches:
input = driver.find_element_by_id("q")
element = input.get_attribute('value')
if len(element) > 0:
input.clear()
input.send_keys(search)
input.submit()
pagehtml = driver.page_source
soup = BeautifulSoup(pagehtml)
identifiers = soup.find_all('span', {"class": "aClass"})
messages = soup.find_all('td', {"anAttribute": "aValue" })
for identifier in identifiers:
idContents.append(identifier.text)
for message in messages:
textContents.append(message.text)
for i, ids in enumerate(idContents):
data.append([ids, textContents[i]])
所以我仍然认为我以错误的方式循环所有内容。但我不知道我到底应该做什么。我试过这个,但继续只获得前 25 次点击。这仅适用于如上所示的“标识符”。
for tr in soup.find_all('tr'):
for td in tr.find_all('td'):
for span in td.find_all('span', {"class": "aClass"}):
if span.parent.name == 'a':
print span.text
好吧——我的错。这是一个解析器问题,在尝试不同的解析器时我很不耐烦。 alecxce 已经提出了这个建议。问题已解决。
【问题讨论】:
-
你能分享你的完整代码吗?谢谢。
-
见上面的完整代码
-
在
submit()后面加上time.sleep(5000)有什么不同吗? -
另外,如果您使用解析器会怎样:
soup = BeautifulSoup(pagehtml, "lxml")或soup = BeautifulSoup(pagehtml, "html.parser")或soup = BeautifulSoup(pagehtml, "html5lib")? -
lxml 解析器是唯一不冻结的。提供与上面建议的第二个循环相同的结果,951 个项目为 1450。如果我执行原始代码,我仍然只能得到 25 个项目。也就是说 - time.sleep 和解析器都没有任何区别
标签: python selenium beautifulsoup