【问题标题】:Html Parser pulling from previous webpageHtml Parser 从上一个网页中提取
【发布时间】:2019-03-10 07:09:37
【问题描述】:

我有一个脚本,它可以加载一个页面并从多个容器中保存一堆数据 ID。然后我想打开新的 url,将这些数据 id 附加到 url 的末尾。对于每个 url,我想找到所有的 href 并将它们与特定链接列表进行比较,如果其中任何一个匹配,我想将该链接和其他一些详细信息保存到表中。

我已经设法让它打开带有附加数据 id 的 url,但是当我尝试在新页面中搜索元素时,如果我再次尝试从汤中查找全部,它要么从解析的第一个 url 中提取它们,要么当我尝试运行另一个 html.parser 时,我经常收到此错误。

ResultSet 对象没有“findAll”属性。您可能将项目列表视为单个项目。当你打算调用 find() 时,你调用了 find_all() 吗?

是不能运行另一个解析器还是我做错了什么?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.action_chains import ActionChains

url = "http://csgo.exchange/id/76561197999004010#x"

driver = webdriver.Firefox()

driver.get(url)
import time
time.sleep(15)
html = driver.page_source
soup = soup(html, "html.parser")

containers = soup.findAll("div",{"class":"vItem"})

print(len(containers))
data_ids = [] # Make a list to hold the data-id's

for container in containers:
    test = container.attrs["data-id"]
    data_ids.append(test) # add data-id's to the list
    print(str(test))

for id in data_ids:
    url2 = "http://csgo.exchange/item/" + id
    driver.get(url2)
    import time
    time.sleep(2)   
    soup2 = soup(html, "html.parser")
    containers2 = soup2.findAll("div",{"class":"bar"})
    print(str(containers2))

with open('scraped.txt', 'w', encoding="utf-8") as file:
    for id in data_ids:
        file.write(str(id)+'\n') # write every data-id to a new line

【问题讨论】:

  • 第一个 URL (csgo.exchange/id/76561197999004010#x) 的页面源没有任何具有 vItem 类的 div,这是我注意到的第一件事。您如何在第一次获得任何结果?对于您的问题,一两个示例 ID 可能会有所帮助,因为这样我们就可以转到 URL 并查看页面源代码。
  • 大约有 885 个具有 vItem 类的 div。我在获取 ID 时没有任何问题。以前帮助我解决上一期问题的人也没有。但这里有一些例子。 15653916980 15653916960 15631554103
  • 我假设当你去加载它没有完全加载的页面。有时页面会挂起,有时会立即打开。我计划让它等到元素存在后再继续,但我现在不知道该怎么做,所以 15 秒睡眠是一个占位符。
  • 我真正想拉的是每个页面上的流历史记录中的所有href,就像这样。 csgo.exchange/item/15653916980 然后我想将其中的每一个与链接列表进行比较,看看它们是否匹配。

标签: python selenium findall html-parser


【解决方案1】:

不确定您想要从每个页面中得到什么。您应该添加等待。我在每个页面的流历史部分(如果存在)中添加等待以查找 href。它应该说明这个想法。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'http://csgo.exchange/id/76561197999004010'
driver = webdriver.Chrome()
driver.get(url)
ids = [item.get_attribute('data-id') for item in WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-id]")))]
results = []
baseURL = 'http://csgo.exchange/item/'
for id in ids:
    url = baseURL + id
    driver.get(url)
    try:
        flowHistory = [item.get_attribute('href') for item in WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#tab-history-flow [href]")))]
        results.append([id, flowHistory])
    except:
        print(url)

【讨论】:

  • 当。好的,这是一种完全不同的方法,甚至没有使用 BS4。除了没有任何hrefs的项目之外,它的工作非常好。它会暂停很长一段时间,但最终会继续。我假设这与 try 方法有关。虽然我不知道为什么它会挂这么长时间。不用说,我想最终过滤掉很多垃圾物品,例如箱子、贴纸和奖牌。
  • 这是我给它等待的时间。您可以将其从 10 减少到更低的数字。这一行: [item.get_attribute('href') for item in WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#tab-history-flow [href]")))
  • 就我想要的每一页而言。这将是位于 div 类“bar”中的项目名称。该项目的链接是它首先访问的链接。然后是它已经获得的流历史中的所有href。然后最终我想将这些href与链接列表进行比较,只保存匹配的那些。但我很感激帮助。我自己不会想到这一点。我开始用头撞墙。
  • 哦,我明白了。加载时它会很快运行,但如果它不存在则挂起。说得通。是的,我会把它缩短到 3 秒。
【解决方案2】:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'http://csgo.exchange/id/76561197999004010'
profile = webdriver.FirefoxProfile()
profile.set_preference("permissions.default.image", 2) # Block all images to load websites faster.
driver = webdriver.Firefox(firefox_profile=profile)
driver.get(url)
ids = [item.get_attribute('data-id') for item in WebDriverWait(driver,30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-id]")))]
results = []
baseURL = 'http://csgo.exchange/item/'
for id in ids:
    url = baseURL + id
    driver.get(url)
    try:
        pros = ['http://csgo.exchange/profiles/76561198149324950']
        flowHistory = [item.get_attribute('href') for item in WebDriverWait(driver,3).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#tab-history-flow [href]")))]
        if flowHistory in pros:
            results.append([url,flowHistory])
            print(results)
    except:
        print()

【讨论】:

  • 至于检查 flowHistory hrefs 是否匹配列表项。我这样做对吗?因为它检查的第一项应该是打印csgo.exchange/profiles/76561198149324950,但我没有得到任何回报。
  • 好吧,我通过使用 if any(flowHistory 中的 elem for elem in pros)更进一步:但它附加了该项目的所有 href,而不仅仅是匹配的那些。所以我需要弄清楚如何让匹配的追加,我很好。
  • 在专业人士中使用 for 字符串:如果 flowHistory 中的字符串 match = string 它返回第一个匹配的 href 但如果有更多则不会返回更多。我越来越近了,但还是没有。
  • 我一直在做家务。还需要什么吗?
  • 我在 justpaste 上手动计算了所有这些,得到 151 加上第一个 url,即项目本身,所以 152。但无论如何这并不重要。
【解决方案3】:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

urls = ['http://csgo.exchange/id/76561197999004010']
profile = webdriver.FirefoxProfile()
profile.set_preference("permissions.default.image", 2) # Block all images to load websites faster.
driver = webdriver.Firefox(firefox_profile=profile)
for url in urls:
    driver.get(url)
ids = [item.get_attribute('data-id') for item in WebDriverWait(driver,30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-id]")))]
results = []
pros = ['http://csgo.exchange/profiles/76561198149324950', 'http://csgo.exchange/profiles/76561198152970370']
baseURL = 'http://csgo.exchange/item/'
for id in ids:
    url = baseURL + id
    driver.get(url)
try:

    flowHistory = [item.get_attribute('href') for item in WebDriverWait(driver,2).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#tab-history-flow [href]")))]
    match = []
    for string in pros:
        if string in flowHistory:
            match = string
            break

    if match:
        pass 

        results.append([url,match])
        print(results)
except:
    print()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2019-08-06
    • 2014-07-21
    • 1970-01-01
    • 2023-03-30
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多