【问题标题】:Cannot group list to print properly, also broken get function?无法正确打印组列表,还破坏了获取功能?
【发布时间】:2020-08-16 10:46:26
【问题描述】:
SymbolTime (NY)Message
FAMI08/14/20, 19:59:52大宗交易。出价时。 (NYSEArca)
KTOV08/14/20, 19:59:31大宗交易。应询。

上面的信息是我正在解析的。

我遇到了两个问题。一个是我不能将整行信息作为一个组打印,它是单独打印的。

第二个;我无法打印 href 元素。该程序将打印第一个 href,然后代码中断。我这是我的代码;

def function_time():
   global url, scan_type, name
   response = session.get(url)
   response = session.get
   soup = bs(response.text, 'html.parser')
   data = soup.findAll()
   page = requests.get(url)
   doc = lh.fromstring(page.content)
    #Parse data that are stored between <tr>..</tr> of HTML
   tr_elements = doc.xpath('//tr')
   tr_elements = doc.xpath('//tr')
    #Create empty list
   col=[]
   i=0
 for t in tr_elements[1]:
    name=t.text_content()
    #link = t.find('a').get('href')
    #print(link) #finds first then breaks 
    print (Fore.GREEN+name)
    col.append((name,[]))
    time.sleep(1)

function_time()

当前打印为

FAMI
08/14/2020
Block Trade

我想把它打印成; FAMI 08/14/2020 Block Trade ,并修复 href 函数(当前由于没有 get 函数错误而结束,尽管打印了第一个。)

我仍在学习中,在研究时不知道如何表达我的问题。提前致谢!

【问题讨论】:

    标签: python for-loop parsing html-table


    【解决方案1】:

    你可以这样做:

     x = []
    
     for t in tr_elements[1]:
        name=t.text_content()
        #link = t.find('a').get('href')
        #print(link) #finds first then breaks 
        x.append(name)
        col.append((name,[]))
        time.sleep(1)
    print(' '.join(x))
    

    简要介绍:

    • .join 将列表中的所有项目连接成一个字符串,并由您在它之前的字符串中定义的任何内容连接(在本例中为 ' ')。
    • 我们将name 附加到列表中,而不是立即打印出来。

    【讨论】:

    • 谢谢!这只是帮助我将他们结合在一起。我使用了“new_name = ', '.join(x)”,现在它打印为“NAME,DATE,INFO”。在打印连接的字符串之前,它仍在一个一个地打印每个元素。我怎样才能让它只打印完整的字符串,而不是逐个打印,然后是完整的字符串?
    • 删除print (Fore.GREEN+name)
    【解决方案2】:

    使用正则表达式怎么样?

    假设您的数据都与您的示例具有相同的结构。

    import re
    
    strs = '''
    SymbolTime (NY)Message
    <a href="/StockInfo/?symbol=FAMI">FAMI</a>08/14/20, 19:59:52Block trade.  At the bid. (NYSEArca)
    <a href="/StockInfo/?symbol=KTOV">KTOV</a>08/14/20, 19:59:31Block trade.  At the ask.
    '''
    
    patterns = [
        re.compile(r'(?<=>)\w+(?=</a>)'), 
        re.compile(r'\d+/\d+/\d+'), 
        re.compile(r'(?<=:\d\d)[\w\s]+(?=.)')
    ]
    # First pattern: match ticker
    # Second pattern: match date
    # Third pattern: match trade type
    
    for s in strs.split('\n'):  # Split your document into lines
        if 'href' in s:  # If 'href' in this line, parse this line
            results = []
            for pattern in patterns:
                results.append(pattern.findall(s)[0])  # Find the three elements one by one
            result_str = ' '.join(results)  # Combine them into one string
            print(result_str)
    

    结果:

    'FAMI 08/14/20 Block trade'
    'KTOV 08/14/20 Block trade'
    

    对于您的第一个问题,您可以通过两种方式解决:

    print('FAMI', end=' ')
    print('08/14/20', end=' ')
    print('Block trade', end=' ')
    

    s = ' '.join(['FAMI', '08/14/20', 'Block trade')
    print(s)
    

    【讨论】:

    • 哇。令人难以置信的赞赏!我应该用重新开始大声笑。它在运行您的代码时工作。我适当地添加了它,它仍然在新加入的字符串之前单独打印每个。现在我似乎找不到最佳位置。 #创建空列表 col=[] #将网站的内容存储在doc下 for s in col.split('\n'): # 把你的文档分成几行 它断了
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多